私はEFでCode Firstを使用しています。2 つのエンティティがあるとします。
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 を呼び出す必要はありません。
今、私は1つの農場からすべての果物をフィルタリングしたいので、これを試しました(Farmクラスで):
from fruit in Fruits where fruit .... select fruit
しかし、生成されたクエリには where 句が含まれていません。これは非常に重要です。なぜなら、何十万もの行があり、それらすべてを読み込んでオブジェクトの場合にフィルタリングするのは効率的ではないからです。
遅延ロードされたプロパティは、最初にアクセスされたときに満たされますが、すべてのデータを読み取ります。次のようなことをしない限り、フィルターを適用することはできません。
from fruits in db.Fruits where fruit .... select fruit
しかし、Farm には DbContext の知識がないため (そうすべきではないと思います (?))、それはできませんが、すべてのデータを操作する必要がある場合、ナビゲーション プロパティを使用するという目的全体を失うだけです。私の農場に属するものだけではありません。
そう、
- 私は何か間違ったことをしていますか/間違った仮定をしていますか?
- 実際のクエリに対して生成されるナビゲーション プロパティにフィルターを適用する方法はありますか? (私は多くのデータを扱っています)
読んでくれてありがとう!