我在 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 到数据库。
现在,我想过滤一个农场的所有水果,我试过这个(在农场类):
from fruit in Fruits where fruit .... select fruit
但是生成的查询不包括 where 子句,这非常重要,因为我有成千上万的行并且在它们是对象时将它们全部加载并过滤它们效率不高。
我读到延迟加载的属性在第一次访问时会被填充,但它们会读取所有数据,除非您执行以下操作,否则无法应用过滤器:
from fruits in db.Fruits where fruit .... select fruit
但我不能这样做,因为 Farm 不了解 DbContext(我认为它不应该(?))而且对我来说,如果我必须处理所有数据,它只会失去使用导航属性的全部目的而不仅仅是属于我农场的那个。
所以,
- 我做错什么/做出错误的假设吗?
- 有什么方法可以将过滤器应用于生成到真实查询的导航属性?(我正在处理大量数据)
感谢您的阅读!