在Queryable对象的Include语句中添加where子句

时间:2016-03-10 21:59:10

标签: c# entity-framework iqueryable

假设我有以下两个表

  • A
  • C

A,B和C表有一个布尔值" IsEnabled"列。

表之间有1对多的关系如下:

  • A-> B
  • B-&以及c

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

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

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

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

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

query.Include ( s => s.B.where ( k => k.IsEnabled = 1 ))(这不起作用并抛出运行时异常)

如果我们可以得到上述问题,我想包括C的列,对于B和C都是IsEnabled = 1的行。这可能吗?

2 个答案:

答案 0 :(得分:1)

Include用于热切地加载关系,但不幸的是,Entity Framework不支持在服务器端过滤这些集合,无论是懒惰还是急切加载。

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

答案 1 :(得分:0)

假设您有一个与此类似的实体

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

public class B
{
    public bool IsEnabled {get;set;}
}

因此,当您执行查询时,ICollectionBs,它应该没有运行时错误。