2
public class MyDbContext: DbContext
{
}
public class Product
{
   public long Id {get; set;}

   public long CategoryId {get; set;}

   [ForeignKey("CategoryId")] 
   public virtual Category Category {get; set;}
}
public class Category
{
   public long Id {get; set;}
   public string Name {get; set;}
}

List<Product> GetProducts()
{
    var context = new MyDbContext();
    var products = context.Set<Product>().ToList();
    var categories = context.Set<Category>().ToList();
    foreach(var product = in products)
    {
        product.Category = categories.First(c => c.Id == product.CategoryId);
    }

    return products;
 }

ここでは、関連するカテゴリを持つすべての製品を最高のパフォーマンスで取得したいと思います。最初に遅延読み込みを試しましたが、多くのデータベースクエリが発生します。次に、積極的な読み込みを使用しますが、生成されたクエリスクリプトは、特に複雑なクエリの場合はそれほど効率的ではありません。だから私は次の方法を使用しました:

  • すべての製品を入手、

  • すべてのカテゴリを取得し、

  • フェッチされたカテゴリから製品のナビゲーションプロパティ「Category」を手動で設定します

私の質問は次のとおりです。

-手動で設定した後でも、EFはナビゲーションプロパティ「Category」を遅延ロードしますか?

-複雑なクエリの積極的な読み込みに対するより良い解決策はありますか?

4

1 に答える 1

4

以下を使用すると、最良の結果が得られますInclude

var products = context.Set<Product>().Include("Category");

これにより、1つのクエリで商品とそのカテゴリが読み込まれ、Categoryプロパティによって遅延読み込みがトリガーされることはなくなります。

さらに良いのは拡張メソッドIncludeです:context.Set<Product>().Include(p => p.Category);

于 2012-12-07T14:18:52.290 に答える