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的总结果。如果有人能告诉我正确的方法,我将不胜感激。

C#实体框架4.1 Lambda Include-仅选择特定的包含值

我认为。。。。

    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()方面进行任何筛选。

我从来没有像你想的那样成功地找到筛选子对象的方法。为了减少从数据库中检索的数据量,我通常只检索父对象,然后在它们上循环,只获取我想要的子对象,并将它们"附加"到父对象。不过,这并不是一条硬性规定,这在某种程度上取决于每个父母有多少孩子,以及我可能想保留其中的百分比。