Linq-to-SQL EntitySet не является IQueryable - какие-либо обходные пути? - PullRequest
8 голосов
/ 02 марта 2011

Когда вы запрашиваете свойство EntitySet для объекта модели в Linq-to-SQL, оно возвращает все строки из набора сущностей и выполняет любые дальнейшие запросы на стороне клиента.

Это подтверждается в нескольких местах в Интернете, и я сам наблюдал за поведением.EntitySet не реализует IQueryable.

Что мне нужно было сделать, это преобразовать код вроде:

var myChild = ... ;
// Where clause performed client-side.
var query = myChild.Parents().Where(...) ;  

в:

var myChild = ... ;
// Where clause performed in DB and only minimal set of rows returned.
var query = MyDataContext.Parents().Where(p => p.Child() == myChild) ;  

Кто-нибудь знает лучшерешение?

Вторичный вопрос: это исправлено в Entity Framework?

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

EntitySet - это просто набор сущностей. Он реализует IEnumerable, а не IQueryable. Шаблон Active Record указывает, что сущности несут непосредственную ответственность за свое постоянство. ИЛИ объекты картографирования не имеют прямого знания о уровне персистентности. ИЛИ Mappers помещают эту ответственность вместе с обязанностями Unit Of Work и Identity Map в контекст данных. Поэтому, если вам нужно запросить источник данных, вы должны использовать контекст (или объект Table). Чтобы изменить это, нужно согнуть используемые шаблоны.

0 голосов
/ 07 июля 2011

У меня была похожая проблема: Как сделать так, чтобы эта SelectMany использовала объединение .Поработав с LINQPad в течение продолжительного времени, я нашел достойное решение.Ключ заключается в том, чтобы подтолкнуть EntitySet, который вы просматриваете внутри a SelectMany, Select, Где и т. Д. Как только он окажется внутри, он станет выражением, а затем провайдер может превратить его в правильный запрос.

Используя ваш пример, попробуйте следующее:

var query = from c in Children
            where c == myChild
            from p in c.Parents
            where p.Age > 35
            select p;

Я не могу на 100% проверить этот запрос, так как не знаю остальную часть вашей модели.Но первые две строки запроса приводят к тому, что остальная часть становится выражением, которое поставщик превращает в соединение.Это работает с моим собственным примером по вопросу, связанному с выше.

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