Entity Framework - чрезмерная загрузка данных с представлениями - PullRequest
3 голосов
/ 23 ноября 2011

У нас проблема с перемещением между объектами, одна из которых основана на представлении.Проблема в том, что когда мы идем

TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault())

В фоновом режиме он загружает все записи в представлении, что не то, что мы хотим или ожидаем.

Однако, когда мы идем

_objectContext.TableEntityView
    .Where(x => x.TableObjectId == TableObjectId && x.Id == Id)

Затем он просто загружает одну строку, что мы и ожидаем

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

Мы используем EF 4 с базой данных SQL 2005.Представления используются для предоставления агрегированной информации, которую EF не может легко сделать без большой загрузки данных (по иронии судьбы).Мы вручную построили 1: много ассоциаций между представлениями.

Почему тогда мы получаем большую загрузку данных в первом экземпляре, а не во втором?

Большое спасибо за всю / любую помощь

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

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

FWIW Мне сказали, что NHibernate поддерживает более детализированные навигационные нагрузки, но эта функция еще непроберитесь в Entity Framework.

EDIT

Этот ответ от Ladislav Mrnka показывает возможное решение вашей проблемы в дни ОСАГО.Не уверен, что с тех пор что-то изменилось.Он использует DbContext, так что вы все равно не сможете просто пахать через свойство навигации, но, вероятно, это так близко, как вы собираетесь получить.

int count = context.Entry(myAccount)
                   .Collection(a =>  a.Orders).Query().Count();`

или для вашего случая, я 'Я предполагаю, что это будет

TableEntityView obj = context.Entry(TableEntity)
                             .Collection(a => a.ViewEntity)
                             .Query().FirstOrDefault(x => x.Id == Id);
1 голос
/ 23 ноября 2011

У меня были некоторые проблемы с тем, как EntityFramework генерирует SQL, поэтому в первую очередь я предлагаю вам использовать LinqPad и одно или несколько из следующего: EntityFramework profiler (оплачивается за программное обеспечение), SQL Profiler (при условии, что вы используете SQL Server) и / или EFTracingProvider

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

То, что я пробовал, часто заставляло некоторые запросы выполняться быстрее:

Написание полного запроса Linq вместо использования лямбда-выражений: их часто легче читатьи они больше похожи на sql, поэтому легче увидеть взаимосвязь между вашим кодом и сгенерированным sql

и

EntitySet.Include (x => x.Property)

Это говорит Linq2Entities включить свойство в запрос

...