2010-12-07 13 views
2

私は、SQLクエリにこのLINQを持っている:このlinqクエリを最適化する方法は?

var items = 
    from i in context.Items 
    orderby i.itemId descending 
    select new ItemWithCategories 
    { 
     item = i, 
     categories = (
      from cats in context.categories 
      join ic in context.itemCategories 
       on cats.categoryId equals ic.categoryId 
      where ic.itemId == i.itemId 
      select cats).ToList() 
    }; 

それは3つのテーブルです。アイテムとカテゴリを結合する必要がありますが、その間にテーブルがあります(多対多)。このクエリを実行する方が良いですか?

+1

生成されたSQLとそのクエリプランを調べましたか? –

答えて

1

これは、同じ結果が得られますが、読みする方がはるかに簡単です:

var items = 
    from item in context.Items 
    orderby item.itemId descending 
    select new ItemWithCategories 
    { 
     item = item, 
     categories = (
      from itemCategory in item.itemCategories 
      select itemCategory.category).ToList() 
    }; 

は私が結合文を削除する方法を参照してください、しかしitemitemCategoriesプロパティを使用していますか?

0

あなたが持っているクエリは、クエリに参照を持つオブジェクトのリスト(カテゴリ)を作成し、アクセスしたときに実行されます(まったく存在する場合)。

これは、クライアントとデータベースサーバーの間で多くの「チャタリング」を引き起こします。また、TDSストリーム全体でヘッダーデータを繰り返し送信するオーバーヘッドが発生する可能性があります。

ここでは、結合を実行してデータを平坦化することを検討してください。左側のデータ(アイテム)を複製する代償として、ただ1回のルックアップが必要です。

もちろん、どの最適化でも、キーはテスト、テスト、テストです。