C#实体框架4.1 Lambda Include-仅选择特定的包含值
本文关键字:选择 包含值 Include- 框架 实体 Lambda | 更新日期: 2023-09-27 18:00:03
我正在对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; }
}
但我只想为每种游戏类型进行下一次抽奖。本质上,我想做一些类似的事情
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的总结果。如果有人能告诉我正确的方法,我将不胜感激。
我认为。。。。
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 for DbExtensions.Include()
。
路径表达式必须由的简单属性访问表达式以及按顺序调用Select在包括集合属性。
所以我认为不允许使用Where()
。我不确定您是否可以在Include()
方面进行任何筛选。
我从来没有像你想的那样成功地找到筛选子对象的方法。为了减少从数据库中检索的数据量,我通常只检索父对象,然后在它们上循环,只获取我想要的子对象,并将它们"附加"到父对象。不过,这并不是一条硬性规定,这在某种程度上取决于每个父母有多少孩子,以及我可能想保留其中的百分比。