Стратегия загрузки данных / синтаксис в EF4 - PullRequest
4 голосов
/ 27 июня 2011

Долгое время скрывался, впервые отправляю сообщения и заново изучаю EF4 и MVC3.

Мне нужна помощь, чтобы убедиться, что я использую правильную стратегию загрузки данных в этом случае, а также некоторую помощь в завершении некоторых деталейзапрос.В настоящее время я использую готовый подход к загрузке, изложенный здесь для некоторого представления «панели мониторинга», для которого требуется небольшой объем данных из примерно 10 таблиц (все имеют отношения FK).

            var query = from l in db.Leagues
                 .Include("Sport")
                 .Include("LeagueContacts")
                 .Include("LeagueContacts.User")
                 .Include("LeagueContacts.User.UserContactDatas")
                 .Include("LeagueEvents")
                 .Include("LeagueEvents.Event")
                 .Include("Seasons")
                 .Include("Seasons.Divisions")
                 .Include("Seasons.Divisions.Teams")
                 .Where(l => l.URLPart.Equals(leagueName))
                         select (l);

            model = (Models.League) query.First();

Однако мне нужно выполнить дополнительную фильтрацию, сортировку и формирование данных, которые я не смог обработать.Вот мои главные потребности / проблемы с этой точки зрения:

  • Некоторые дочерние объекты все еще нуждаются в дополнительной фильтрации, но я пока не смог выяснить синтаксис или лучший подход.Пример: «TOP 3 LeagueEvents.Event WHERE StartDate> = getdate () ORDER BY LeagueEvents.Event.StartDate»

  • Мне нужно отсортировать некоторые поля.Примеры: ORDERBY Seasons.StartDate, LeagueEvents.Event.StartDate, LeagueContacts.User.SortOrder и т. Д.

  • Я уже очень обеспокоен общим размером SQL, генерируемого этимзапрос и количество объединений, и я думаю, что мне может понадобиться совсем другой подход к загрузке данных. (Явная загрузка? Несколько объектов QueryObject? POCO?)

Любой ввод, направление или совет покак решить эти остающиеся потребности, а также обеспечить высокую производительность.

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Ваша забота о размере запроса и размере набора результатов ощутимы .

Как уже упоминалось в @BrokenGlass, EF не позволяет вам выполнять фильтрацию или упорядочивание включений.Если вы хотите упорядочить или отфильтровать отношения, вы должны использовать проекцию либо на анонимный тип, либо на пользовательский (не сопоставленный) тип:

        var query = db.Leagues
                      .Where(l => l.URLPart.Equals(leagueName))
                      .Select(l => new 
                          {
                              League = l,
                              Events = l.LeagueEvents.Where(...)
                                                     .OrderBy(...)
                                                     .Take(3)
                                                     .Select(e => e.Event)
                              ... 
                          });
0 голосов
/ 28 июня 2011

К сожалению, EF не позволяет выборочно загружать связанные объекты, используя его свойства навигации, он всегда будет загружать все Foos, если вы укажете Include("Foo").

Вам нужно будет объединить каждую из связанных сущностей, используя ваши Where() предложения в качестве фильтров, где они применяются.

...