C # Entity Framework 4.1 Lambda Include - выбирайте только определенные включенные значения - PullRequest
2 голосов
/ 21 июня 2011

Я делаю лямбда-выбор в EF4.1, включая другой связанный DBSet в моем текущем утверждении.

 return dbEntity.GameTypes.Include(a => a.Draws)
                           .Where(d => d.IsActive == true )
                           .ToList();

У меня есть два класса:

//simplified versions of the classes
public class GameType
{
 public Nullable<bool> IsActive { get; set; }
 public virtual ICollection<Draw> Draws { get; set; }
}

public class Draw
{
 public int DrawID { get; set; }
 public int GameTypeID { get; set; }
 public System.DateTime DrawDate { get; set; }
} 

НоЯ хочу только следующий предстоящий розыгрыш для каждого GameType.По сути, я хочу сделать что-то вроде

 return dbEntity.GameTypes.Include(a => a.Draws.Where(aw => aw.DrawDate > System.DateTime.Now)
                                               .OrderBy(ao => ao.DrawDate)
                                               .First())
                           .Where(d => d.IsActive == true )
                           .ToList();

Но это дает мне:

Выражение «Включить путь» должно ссылаться на свойство навигации, определенное для типа.Используйте точечные пути для справочных навигационных свойств и оператор Select для коллекционных навигационных свойств.

Возможно ли что-то подобное или мне нужно будет отфильтровать результат впоследствии?Затем я также хотел бы упорядочить итоговый результат по последней дате Draw.DrawDate.Если бы кто-нибудь мог показать мне правильный путь, я был бы очень благодарен.

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Я думаю ....

    from g in dbEntity.GameTypes.Include("Draws")
   where g.IsActive
     let d = g.Draws.Where(o => o.DrawDate > System.DateTime.Now)
                    .OrderBy(o => o.DrawDate)
                    .Take(1)       // Needs to stay a collection
  select new GameType {IsActive = g.IsActive, Draws = d}

не проверено - но это может привести вас на правильный путь ...

0 голосов
/ 21 июня 2011

Мне никогда не удавалось найти способ фильтровать детей так, как вы хотите.Чтобы уменьшить объем данных, извлекаемых из базы данных, я обычно извлекаю только родительские объекты, а затем зацикливаю их, получая только нужных мне детей, и «присоединяю» их к родителю.Это не жесткое правило, оно зависит от того, сколько детей на каждого родителя и какой процент из них я, вероятно, захочу оставить.

0 голосов
/ 21 июня 2011

Из MSDN для DbExtensions.Include().

Выражение пути должно состоять из простых выражений доступа к свойству вместе с вызовами Select для составления дополнительных включений после включениясвойство коллекции.

Так что я не думаю, что использование Where() разрешено.Я не уверен, что вы можете сделать какую-либо фильтрацию, когда дело доходит до Include().

...