C#Entity Framework 4.1 Lambda Include - 仅选择特定的包含值

时间:2011-06-21 01:49:37

标签: c# lambda include entity-framework-4.1

我在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订购总结果。如果有人能告诉我正确的方式,我会感激不尽。

3 个答案:

答案 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)

我从来没有成功地找到像你想要的那样过滤孩子的方法。为了减少从数据库中检索的数据量,我通常只检索父对象,然后遍历它们只获取我想要的子对象并将它们“附加”到父对象。这不是一个严厉的规则,它取决于每个父母有多少孩子,以及我可能想要保留多少百分比。

相关问题