Silverlight — LinqToEntities — Как вернуть анонимные типы

Я не уверен, правильно ли я поступаю. У меня есть приложение Silverlight, и во многих случаях я использую Entity Framework. У меня есть два объекта, сопоставленные с моей базой данных: заголовок и сведения. Я хочу отправить левое внешнее соединение, чтобы получить все подсчеты заголовков и деталей, даже если в записи заголовка нет подробной записи. Вот запрос Linq, который я хочу запустить с клиента:

var query =
      from head in storeContext.Headers
      join detail in storeContext.Details
      on head.HeadId equals details.HeadId
      into group
      select new 
      {
        Desc = head.Description,
        MyCount = group.Count()
      };

Поскольку это Silverlight, мне нужно построить свой запрос, а затем отправить его на сервер с помощью метода storeContext.Load<T>() из моей доменной службы (контекст на клиенте). Поскольку этот метод ожидает тип, я не знаю, как структурировать вызов для возврата анонимного типа, как я понял выше?

Я делаю все это неправильно? Должен ли я использовать метод Invoke для чего-то подобного? Если да, то как и где определить тип, который я хочу вернуть?

Если кто-то может указать мне в правильном направлении, я бы очень признателен.

Спасибо... Скотт


person Scott    schedule 03.12.2010    source источник
comment
вы не можете возвращать анонимные типы, неважно, находитесь ли вы в WCF RIA или где-то еще   -  person sebagomez    schedule 03.12.2010
comment
возможный дубликат Вернуть анонимный тип?   -  person nawfal    schedule 28.06.2014


Ответы (2)


Вы не можете вернуть анонимный тип. Они по необходимости являются локальными для текущей области.

Ваш запрос выглядит правильно, но вам нужно будет вернуть именованный тип:

var query =
      from head in storeContext.Headers
      join detail in storeContext.Details
      on head.HeadId equals details.HeadId
      into group
      select new MyHelper // SPECIFY A CLASS HERE
      {
        Desc = head.Description,
        MyCount = group.Count()
      };

Ваш метод запроса должен будет вернуть IEnumerable<MyHelper>:

public IEnumerable<MyHelper> GetInfo()
{
    var query ...

    return query;
}
person ChrisF    schedule 03.12.2010
comment
Разве вы не можете вернуть анонимный тип, обернув его dynamic? - person Jeff Yates; 03.12.2010
comment
@Jeff - я еще не играл с dynamic, так что не знаю. - person ChrisF; 03.12.2010
comment
Я тоже, но теперь мне любопытно. Не то чтобы я думаю, что это обязательно хорошая идея, но, тем не менее, интересная. - person Jeff Yates; 03.12.2010
comment
Спасибо за помощь. Это решило мою проблему. Вопрос: Лучше создать вспомогательный класс и на клинете, и на сервере, или просто добавить Using в клиент? - person Scott; 04.12.2010
comment
@ Скотт, вы должны просто иметь возможность создать класс на сервере, и если вы создадите класс метаданных, он будет автоматически создан на клиенте. - person ChrisF; 04.12.2010

Вы никогда не сможете вернуть из метода значение, являющееся экземпляром анонимного типа. Анонимные типы всегда являются локальными для метода. Если вы хотите вернуть тип через WCF, вам придется написать класс самостоятельно, а не полагаться на анонимные типы.

person Kirk Woll    schedule 03.12.2010