【问题标题】:Linq query with where clause on related data在相关数据上使用 where 子句的 Linq 查询
【发布时间】:2020-01-14 21:14:16
【问题描述】:

我有一个使用以下代码查询的两个 SQL 表(A 和 B)的数据上下文:

                    var query = from b in _ctx.A
                                .Where(b => b.Flag == true).Include(c => c.B)
                                select b;

Flag 列位于表 A 中。我想在查询中添加一个额外的 where 子句,用于检查表 B 中名为 Qty 的列的值 > 10。

我尝试了以下代码,但出现错误:

                    var query = from b in _ctx.A
                                .Where(b => b.Flag == true)
                                .Include(c => c.B.Where(i => i.Qty >= 10))
                                select b;

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

我找到了这个参考: The Include path expression must refer to a navigation property defined on the type.in eager loading

但我不明白如何将 select 用于我的查询。

【问题讨论】:

    标签: c# entity-framework-4 linq-to-entities


    【解决方案1】:

    如果由于任何其他原因未加载属性,则包含路径仅用于加载属性。

    无法过滤导航集合,因为它正在建立关系。它始终具有“其他地方的所有关联实体”的含义。

    但我们可以反转查询,假设 classB 具有 classA 的属性 A。

                 var query = _ctx.B
                                .Where(b => b.Qty >=10 && b.A.Flag);
                                .Include(b => b.A)
    

    在这种情况下,Where 子句不会加载属性 B,这只是在服务器上进行评估。这里的 include 确实是填充属性 A 所必需的。

    现在您将获得所有 B 与关联 A 的列表。 如果你想要你的 A 集合,你可以按 A 分组

                 var query = _ctx.B
                                .Where(b => b.Qty >=10 && b.A.Flag)
                                .GroupBy(x => x.A);
    

    这将导致 A 的集合,以及所有关联的 B 的数量>10。

    【讨论】:

    • 我在所有 3 个建议的答案上都遇到了错误:第二个建议给了我错误:运算符 '&&' 不能应用于 bool 和 IEnumerable 类型的操作数
    • 不确定这是否重要,但我的上下文定义如下:public virtual DbSet A {get;set;} 和 public virtual DbSet B{get;set;}。该查询不会公开 DbSet B。
    • 我没有看到你的类,但你的包含让我假设,你的类 A 有一个名为 B 的属性,可能存储在 DbSet B 中?那没关系。您确实建立了从 A 到 B 的关系,使用外键等?你 ? b, 怎么可能是一个 DBSet ?在_ctx.A.Where(b => 上,b 是 A 类类型的变量。当然。这就是它所说的。我的建议使用或请求 DbSet. 没有任何意义
    • 我的 classA 和 classB 用一个 ID 链接。 classB 包含我要过滤的列。
    • 对,你误导了我,是 1:N 关系吗? 1 A 倍数 B,可能是的。你想加载什么?所有 B 都与 A 相关联?那会更容易。加载时无法过滤导航集合。这是根据关系的定义。它必须始终是“A 拥有的所有 B”。我们可以反过来,B类也有属性A吗?
    猜你喜欢
    • 2018-08-14
    • 2010-10-24
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多