Как ограничить количество свойств, которые EF имеет gen'd при использовании в качестве поиска - PullRequest
1 голос
/ 07 декабря 2010

Если бы я хотел вернуть только идентификатор и имя из коллекции сущностей Клиента, что бы рекомендовать для этого? Должен ли я использовать Entity Set и затем выбрать то, что мне нужно, когда я зацикливаю коллекцию? Существует ли синтаксис LINQ, который может дать мне эквивалент предложения SQL Select (т. Е. Select ID, Name From Customer).

Спасибо, Стивен

1 Ответ

4 голосов
/ 07 декабря 2010

Используйте Queryable. Выберите <TSource, TResult> , чтобы спроецировать коллекцию:

var customers = ctx
   .Customers
   .Where(x => x.FirstName == "Joe")
   .Select(x => new { ID = x.CustomerId, Name = x.CustomerName })
   .ToList();

Обратите внимание, что результаты будут проецироваться в List<T> анонимных типов.

Если вы хотите спроецировать его на что-то другое (например, пользовательский класс / POCO), вам нужно будет объединить результирующий набор сначала и , а затем проецировать запрос (например .ToList(), а затем .Select()).

Другими словами, если вы сделаете это:

var customers = ctx
       .Customers
       .Where(x => x.FirstName == "Joe")
       .Select(x => new CutDownCustomer { ID = x.CustomerId, Name = x.CustomerName })
       .ToList(); // fire query

Вы получите ошибку EF (невозможно преобразовать в запрос Linq-Entities - поскольку «CutDownCustomer» не является частью концептуальной модели).

Итак, вы должны сделать это:

var customers = ctx
       .Customers
       .Where(x => x.FirstName == "Joe")
       .ToList() // fire query
       .Select(x => new CutDownCustomer { ID = x.CustomerId, Name = x.CustomerName });

Конечно, если вам требуется только область действия метода для набора результатов, анонимных типов должно быть достаточно.

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...