首页 > 解决方案 > Linq where 集合上的条件(导航属性)

问题描述

我一直在筛选几个帖子,但似乎没有一个答案有效或不适用于我的情况,也许我正在监督一些事情......

我有一个实体 Yogi,它有一个订阅集合(也是一个实体)。我想检索一个瑜伽士,但只包括特定日期之后的订阅。

我尝试了以下方法(也用 Select 替换了(第二个)Where):

ctx.Yogis.Where(y => y.YogiId == id)
         .Include(y => y.Subscriptions.Where(s=> s.YogaClassDate.Date >= DateTime.Now.Date))
         .Include("Subscriptions.YogaClass")
         .FirstOrDefault();

但结果收到此错误:

包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。

如果可能的话,我想避免之后必须进行迭代和比较,所以有什么方法可以直接得到这个,或者像其他人建议的那样,没有,我应该得到那个 Yogi 的所有订阅的集合并过滤掉那些我不想显摆?

提前感谢您的任何建议或指示!

编辑(谢谢格特阿诺德): 我尝试了匿名投影,但我错过了一个关键部分

.AsEnumerable()
.Select(x => x.b)

所以这使它工作:

ctx.Yogis.Where(y => y.YogiId == id)
         .Select(y => new
                      {
                       y,
                       Subscriptions = y.Subscriptions.Where(s=> s.YogaClassDate >= DateTime.Now)
                      })
         .AsEnumerable()
         .Select(x => x.y)
         .ToList();

标签: c#entity-frameworklinqcollectionswhere-clause

解决方案


试试看:

    ctx.Yogis.Where(y => y.YogiId == id)
     .Include(y => y.Subscriptions)
     .Include("Subscriptions.YogaClass").Where(s=> s.Subscriptions.YogaClassDate.Date >= DateTime.Now.Date)
     .FirstOrDefault();

推荐阅读