2010-03-10 3 views
1

Что я хочу сделать, кажется довольно простым. Я хочу выбрать некоторых работодателей, и я хочу включить последние 6 квартальных данных, отсортированных по годам и кварталам.LINQ to Entities (Entity Framework) Присоединиться и включить конфликт

Рассмотрим выражение:

var query = from e in data.Employer.Include("EmployerQuarterly") 
      where e.UIAccount == 22 
      select e; 

я на правильном пути, потому что я получаю 7 Работодатель записей, которые я хотел, и каждый из них имеют все квартальных данных. Теперь все, что мне нужно сделать, это упорядочить данные и выбрать только первые 6 записей.

Это выражение выполняет заказ путем, но не предел 6.

var query = from e in data.Employer.Include("EmployerQuarterly") 
      from q in e.EmployerQuarterly 
      where e.UIAccount == 22 
      orderby q.Year descending, q.Quarter descending 
      select e; 

Запрос выше, также имеет два нежелательных побочных эффектов. Я теперь возвращаю 208 записей, а не мои оригинальные 7 И я больше не возвращаю данные EmployerQuarterly!

Я не хочу жертвовать своей энергичной загрузкой. Является ли то, что я прошу о возможности с L2E?

+0

Должен ли ваш вопрос просто состоять в том, как я могу получить семь верхних рядов EmployerQuarterly для каждого работодателя на основе критериев x? – TFD

ответ

6

Вы не можете ограничить связь, поскольку EF не будет загружать частично материализованный объект. Поэтому, если вы хотите загрузить подмножество связанных данных, вам нужно проектироваться в POCOs, а не загружать объекты. Т.е .:

var query = from e in data.Employer 
      where e.UIAccount == 22 
      select new 
      { 
       Id = e.Id, 
       Name = e.Name, 
       // etc. 
       Quarterlies = (from q in e.EmployerQuarterly 
           orderby q.Year descending, q.Quarter descending 
           select new 
           { 
            Id = q.Id, 
            // etc. 
           }).Take(6) 
      }; 

Потому что вы осуществляете, вы больше не нужны Include().

+0

Я хотел избежать проекции, но это не так уж плохо. –

+0

Знаете ли вы, что если я буду выбирать новый {Employer = e, ... {вставить здесь остальную часть вашего кода}, то ежекварталы будут автоматически загружены в объекты Employer материализатором? то есть я могу сказать result.Employer.First(). EmployerQuarterly.Count(), и они все там, как я хотел, хотя это не то, что я просил? Довольно удивительная недокументированная функция! –

+0

Да, это правильно: http://blogs.msdn.com/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx –

Смежные вопросы