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()
,
Мне никогда не удавалось найти способ фильтровать детей так, как вы хотите. Чтобы уменьшить объем данных, извлекаемых из базы данных, я обычно извлекаю только родительские объекты, а затем зацикливаю их, получая только нужных мне детей, и "присоединяю" их к родителю. Это не жесткое правило, оно зависит от того, сколько детей на каждого родителя и какой процент из них я, вероятно, захочу оставить.