【发布时间】:2013-05-22 14:20:14
【问题描述】:
我在 EF 中使用 Code First。假设我有两个实体:
public class Farm
{
....
public virtual ICollection<Fruit> Fruits {get; set;}
}
public class Fruit
{
...
}
我的 DbContext 是这样的:
public class MyDbContext : DbSet
{
....
private DbSet<Farm> FarmSet{get; set;}
public IQueryable<Farm> Farms
{
get
{
return (from farm in FarmSet where farm.owner == myowner select farm);
}
}
}
我这样做是为了让每个用户只能看到他的农场,而我不必在每个查询中调用 Where 到 db。
现在,我想过滤一个农场的所有水果,我尝试了这个(在 Farm 类中):
from fruit in Fruits where fruit .... select fruit
但是生成的查询不包括 where 子句,这非常重要,因为我有成千上万的行,并且在它们是对象时将它们全部加载并过滤它们效率不高。
我了解到延迟加载的属性在第一次访问时会被填充,但它们会读取所有数据,除非您执行以下操作,否则无法应用过滤器:
from fruits in db.Fruits where fruit .... select fruit
但我不能这样做,因为 Farm 不了解 DbContext(我认为它不应该(?))而且对我来说,如果我必须使用导航属性,它只会失去使用导航属性的全部目的所有数据,而不仅仅是属于我农场的数据。
所以,
- 我是否做错了什么/做出了错误的假设?
- 有什么方法可以将过滤器应用于生成到实际查询的导航属性? (我正在处理大量数据)
感谢您的阅读!
【问题讨论】:
标签: c# .net entity-framework entity-framework-5 code-first