はEF

2009-06-30 9 views
2
でクエリの数を減らして

I以下のモデルがあります:はEF

エンティティ:

  • 属性(すべてのデータが含まれています:

    • 製品は、(価格など 製品の基本的なデータが含まれています)可能なオプション属性)
    • ProductAttribute(製品のオプション属性のデータが含まれています。たとえば、 色、モデル、サイズ)。 ProductAttribute は、本質的にペイロードを持つ多くの 関係(のProductId、 AttributeID、バリュー)

    とコードのこの作品に多くのです:

    private static void ListAttributes(Product p) 
    { 
        p.ProductAttributes.Load(); 
        foreach (var att in p.ProductAttributes) 
        { 
         att.Attribute.load(); 
         Console.WriteLine("\tAttribute Name:{0} - Value {1}", 
          att.Attribute.Name, 
          att.AttributeValue); 
        } 
    } 
    

    コードのこの作品は、毎回のクエリを起動しますforeachループではatt.Attribute.Load()メソッドが呼び出されますので、属性の名前を表示することができます。 すべての属性値を取得するクエリ、つまりProductAttributeとAttributeを結合するクエリとともにAttribute.Nameをフェッチしたいとします。 私の方法でこれを達成する方法はありますか?

  • 答えて

    1

    あなた自身で各エンティティの読み込みを実行するためにEntityObjectの周りにラッパーがあるようです。

    この構造を維持したい場合。あなたがしなければならないことは、ProductAttributes.Load()メソッドをオーバーロードしてenumなどを受け入れることだと思います。次に、そのLoadメソッドの中で、LinqからEntityまたはEntity-SQLのクエリを実行して、属性を追加します。

    var query = from c in context.Product.Include("Attributes"); 
    
    +0

    私はp.ProductAttributes.Load()に問題はありません。部。これにより、各製品のクエリが発生します(数十のオーダー)。この問題は、att.Attribute.load()にあります。これは100のオーダーのSQLクエリを起動するからです。 さらに、att.Attribute.IsLoadedプロパティを使用すると不要なクエリの数が減りますが、これはまだ最適ではありません。 – Gio2k

    +0

    私には、att.Attribute.load()メソッドを使用する方法はありません。それは「子供」だからです。兄弟の属性についてはわかりません。 「親」ロードメソッド(p.ProductAttributes.Load())を使用して作業する場合、そのロードメソッドが製品と属性を単一のメソッド呼び出しで生成するようにすることができます。 –