实体框架包括条件

时间:2014-06-05 19:35:06

标签: c# asp.net linq entity-framework

我有两个相关的实体ActiveContractBudgetSource。我尝试抓取所有标记为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();

有效,但我假设它会再做第二次查询吗?如果是这样,有没有办法一次性完成。

1 个答案:

答案 0 :(得分:3)

  

有效,但我假设它会再做第二次查询吗?

不,不是。您可以通过查看为此查询生成的SQL来亲眼看到。

查询提供程序已成功将您的第一个查询转换为SQL的理论可能性范围内,但这样做很难。这根本不是EF的开发人员选择放入其查询提供程序的功能。相反,您被迫以某种方式投射出相关实体的集合来过滤它们,您无法使用Include为您完成此操作。