我在EF4.1上做一个lambda选择,包括我当前声明中的另一个相关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();
但它给了我:
Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。
这样的事情是可能的,还是我需要在之后过滤结果?我还想用最新的Draw.DrawDate订购总结果。如果有人能告诉我正确的方式,我会感激不尽。
答案 0 :(得分:2)
我想......
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}
未经测试 - 但它可能会让你走上正确的道路......
答案 1 :(得分:0)
从MSDN获取DbExtensions.Include()
。
必须组合路径表达式 简单的属性访问表达式 连同按顺序调用Select 以后撰写其他内容 包括收集财产。
所以我认为不允许使用Where()
。我不确定在Include()
时是否可以进行任何过滤。
答案 2 :(得分:0)
我从来没有成功地找到像你想要的那样过滤孩子的方法。为了减少从数据库中检索的数据量,我通常只检索父对象,然后遍历它们只获取我想要的子对象并将它们“附加”到父对象。这不是一个严厉的规则,它取决于每个父母有多少孩子,以及我可能想要保留多少百分比。