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

Я делаю лямбда-выбор на 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 ответа

Я думаю....

    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}

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

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

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

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

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

Другие вопросы по тегам