如何懒惰地查询集合导航属性

时间:2014-09-08 12:06:22

标签: performance entity-framework linq-to-entities

当我必须关注POCO时

class Poco {
  public int Id {get; set;}
  public virtual ICollection<Child> Children {get; set;}
}

和孩子

class Child {
  public int MyProperty {get; set;}
}

如果他们满足某些谓词,我想得到一些孩子,例如

Poco mypoco = getMyPoco();
IEnumerable<Child> someChildren = mypoco.Children
                                  .Where( child => child.MyProperty > 30);

我注意到这首先从数据库中获取所有子项,然后对返回的列表进行过滤。如何确保条件在数据库上而不是在我的应用程序中运行?

1 个答案:

答案 0 :(得分:2)

您可以使用Load方法使用显式加载,但需要暂时禁用延迟加载。

var context = ...; // DbContext
context.Configuration.LazyLoadingEnabled = false;

context.Entry(mypoco)
   .Collection(poco => poco.Children)
   .Query() 
   .Where(child => child.MyProperty > 30)
   .Load();

过滤器将在数据库中完成并加载到Children