2011-08-06 14 views
1

プロジェクトでEntity Framework 4を使用していますが、できるだけ最適化されていることを確認する必要がある特定のクエリが繰り返し実行されています。LINQクエリのパフォーマンス

私は1つのデータベーステーブルを持っているが、次の重要な列を持つItemsと呼ばれる:

id (primary key) 
name 

別のテーブルにはFavoriteItemsは二つの重要な列私のコード内のメソッドで

itemId (foreign key to the items table) 
accountId(foreign key to the account table) 

を持っていると呼ばれる、私はaccountIdを持っています、入力パラメータとしてsearchTermを含む。

このメソッドは、その名前の一部としてsearchTermを持つitemsテーブルのすべてのアイテムを返す必要があります。また、アルファベット順にソートする必要がありますが、accountIdが一致するFavoriteItemsテーブルにIdを持つアイテムがあります。パラメータとして指定されたaccountIdは、一番上に(アルファベット順に)並べる必要があります。さらに、検索結果には、お気に入りの項目かどうかを示すブール値が含まれている必要があります。

私はそれを動作させましたが、クエリは不器用に思えます。どのようにあなたはエレガントで演技的な方法でこのクエリを記述しますか?

+1

クエリを追加できますか? – sternr

+4

必ずしも答えではなく、「可能な限り最適化」されていることが重視されている場合は、*個人的に* TSQLでこれを書いています。 YMMV。ちょうど 'sayin' ... –

+0

あなたはクエリを書いて、あなたはパフォーマンスの問題を抱えているのですか、それとも先制攻撃されていますか? – BZink

答えて

3

私はあなたがこのような何かを意味すると思う:

public void TheMethod(int accountId, string searchTerm) 
{ 
    var result = from item in ctx.Items 
       where item.Name.Contains(searchTerm) 
       let temp = new 
        { 
         Name = item.Name, 
         IsFavorite = item.FavoriteItems 
          .Any(f => f.AccountId == accountId) 
        } 
       orderby temp.IsFavorite descending, temp.Name 
       select temp; 
} 

は、あなたが必要とするだけの値を持つ中間オブジェクトを作成していることを注文し、それを選択します。

名前にsearchTermが含まれているすべてのアイテムが必要なので、さらに最適化することはできません。それはおそらくWHERE Name LIKE %@name%に変換されているので、おそらく最も高価な部品です。

クエリのEXISTS SELECT TOP(1)...タイプでIsFavoriteフィールドの結果をもたらし、そして非常に安価である必要があり.Anyコール。

+0

これは非常に良いようです:)私は今日後で家に帰るときこれを確認し、それがうまくいけば受け入れられるとマークします。 –

+0

それは魅力として働いた。私は 'let'キーワードに精通しているわけではありませんが、このような場合にはどこが役に立つか確かに分かります。どうもありがとう。 –