Entity Framework работает медленно с большими наборами данных - PullRequest
3 голосов
/ 21 декабря 2011

Я использую Entity Framework для получения большого набора данных.

Набор данных имеет отношение родитель / потомок, и мне нужно вернуть информацию о потомке одновременно с родителем.

Я обнаружил, что EF первоначально отправляет один запрос для получения списка родительских объектов, а затем выполняет итерацию по каждому родительскому объекту и запрашивает в БД информацию о дочерних элементах.

Таким образом, если у меня есть 1000 родительских объектов, я получаю в общей сложности 1001 вызов в БД (один раз для каждого родительского объекта плюс исходный запрос, который получает список родителей).

Есть ли способ сделать запрос EF более эффективным? Что-то вроде:

SELECT * FROM CHILD_OBJECT_TABLE WHERE PARENTID IN (LIST OF PARENT_IDS HERE)

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

Как вы выполняете свой запрос? Если вы используете ленивую загрузку, вы будете испытывать поведение, которое вы описываете. Вместо этого используйте функцию Include, чтобы указать, что конкретное свойство навигации (будь то связанный объект или коллекция) должно быть загружено как часть запроса. Проще говоря, EF сгенерирует сплюснутый декартовый продукт обоих отношений, а затем правильно переформатирует данные в отношения родительские> дочерние, когда он создает ваши объекты.

Например, если у вашего родительского класса есть свойство коллекции с именем «Дети», вы бы назвали его следующим образом:

context.Parents.Include("Children").Where(p=> ...)

Или, если вы предпочитаете синтаксис запроса, а не синтаксис метода расширения ...

from p in context.Parents.Include("Children")

where p ...
0 голосов
/ 22 декабря 2011

Проще всего, вы можете использовать два вызова в одном контексте, и все будут загружены, как EF будет сопоставлять отношения в любом случае, даже если они загружены по-разному, однако, все дочерние элементы должны быть загружены сначала, а затем родители.

 // load children
 var children = context.ChildTypes.Where(
      x => x.Parent.SomeProperty == SomeValue );

 var parents = context.ParentTypes.Where(
      x => x.SomeProperty == SomeValue );

Это загрузит все правильно и заметит, что условие применяется в обоих запросах, нет необходимости в операции IN, так как EF отобразит условие ParentType для правильного объединения и загрузит связанные записи.

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