我有两个相关的实体ActiveContract
和BudgetSource
。我尝试抓取所有标记为isActive = true
的BudgetSource,以及所有标记为ActiveContracts
的关联isActive = true
。我累了:
var d = budgetSourceRep.All.Where(x => x.isAcitve)
.OrderBy(x => x.SourceName)
.Include(z => z.ActiveContracts.Where(q => q.isActive))
.Select(y => new EditSelectItemViewModel
{
Id = y.Id,
SourceName = y.SourceName,
DisplayOnNew = y.DisplayOnNew,
NumberOfTimesUsed = y.ActiveContracts.Count()
}).ToList();
但这给了我一个错误
Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。参数名称:路径
然后我将其更改为将过滤器放入投影中:
var d = budgetSourceRep.All.Where(x => x.isAcitve)
.OrderBy(x => x.SourceName)
.Include(z => z.ActiveContracts)
.Select(y => new EditSelectItemViewModel
{
Id = y.Id,
SourceName = y.SourceName,
DisplayOnNew = y.DisplayOnNew,
NumberOfTimesUsed = y.ActiveContracts.Count(a => a.isActive)
}).ToList();
有效,但我假设它会再做第二次查询吗?如果是这样,有没有办法一次性完成。
答案 0 :(得分:3)
有效,但我假设它会再做第二次查询吗?
不,不是。您可以通过查看为此查询生成的SQL来亲眼看到。
查询提供程序已成功将您的第一个查询转换为SQL的理论可能性范围内,但这样做很难。这根本不是EF的开发人员选择放入其查询提供程序的功能。相反,您被迫以某种方式投射出相关实体的集合来过滤它们,您无法使用Include
为您完成此操作。