【问题标题】:Add where clause in Include statement for Queryable object在 Queryable 对象的 Include 语句中添加 where 子句
【发布时间】:2016-03-10 21:59:09
【问题描述】:

假设我有以下两个表

  • 一个
  • B
  • C

A、B 和 C 表有一个布尔“IsEnabled”列。

表之间存在一对多的关系,如下:

  • A->B
  • B->C

我正在使用实体框架来查询表,并且编程是用 C# 编写的。 假设,我需要 A 中的所有列,我执行以下操作:

var query = _context.A; query.where( <where clause> )

如果我需要包含 B 的列以防止延迟加载,

query.Include ( s => s.B );

问题是,如何通过添加 where 子句仅选择 IsEnabled = 1 的行来包含 B 的列? 我正在寻找类似的东西:

query.Include ( s =&gt; s.B.where ( k =&gt; k.IsEnabled = 1 ))(这不起作用并引发运行时异常)

如果我们能得到上面的问题,我也想包含 C 的列,即 B 和 C 的 IsEnabled = 1 的行。这可能吗?

【问题讨论】:

    标签: c# entity-framework iqueryable


    【解决方案1】:

    Include 用于预先加载关系,但不幸的是,Entity Framework 不支持在服务器端过滤这些集合,无论是延迟加载还是预先加载。

    您有两个选择 - 执行过滤客户端,或重新排列查询以最有效地使用(例如,如果您使用 C,请选择 C.Where(c =&gt; c.IsEnabled &amp;&amp; c.B.IsEnabled &amp;&amp; c.B.A.IsEnabled))。

    【讨论】:

      【解决方案2】:

      假设你有一个类似的实体

      public class A
      {
          public int Id {get;set;}
          public ICollection<B> Bs {get;set;}
      }
      
      public class B
      {
          public bool IsEnabled {get;set;}
      }
      

      因此,当您进行查询时,因为您有 ICollectionBs,它应该可以正常工作而不会出现运行时错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 2016-02-05
        • 2019-06-26
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        相关资源
        最近更新 更多