我在EF中使用Code First.假设我有两个实体:
public class Farm
{
....
public virtual ICollection<Fruit> Fruits {get; set;}
}
public class Fruit
{
...
}
Run Code Online (Sandbox Code Playgroud)
我的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做,以便每个用户只能看到他的农场,我不必调用每个查询的位置到数据库.
现在,我想过滤掉一个农场的所有水果,我试过这个(在Farm类中):
from fruit in Fruits where fruit .... select fruit
Run Code Online (Sandbox Code Playgroud)
但是生成的查询不包含where子句,这非常重要,因为我有几十万行,加载它们并在它们是对象时过滤它们效率不高.
我读到延迟加载的属性在第一次被访问时被填充,但是他们读取了所有数据,没有过滤器可以应用,除非你做这样的事情:
from fruits in db.Fruits where fruit .... select fruit
Run Code Online (Sandbox Code Playgroud)
但我不能这样做,因为Farm不知道DbContext(我不认为它应该(?))而且对我来说它只是失去了使用导航属性的全部目的,如果我必须处理所有数据而不仅仅是属于我的农场的人.
所以,
谢谢你的阅读!