2016-11-25 4 views
1

ユーザーの選択に応じて条件付きで追加の場所/結合を追加するフィルタがあります。複数の場所と内部の結合

どの方法が他の方法より高速で、なぜそうですか?

var queryable = db.Sometable.Where(x=> x.Id > 30); 
queryable = queryable.Where(x=> x.Name.Contains('something')); 
var final = queryable.ToList(); 

例では、参加:

var queryable1 = db.Sometable.Where(x=> x.Id > 30); 
var queryable2 = db.Sometable.Where(x=> x.Name.Contains('something')); 
var final = (from q1 in queryable1 join q2 in queryable2 on q1.Id equals q2.Id select q1).ToList(); 

注:を私は複数のWhereを優先しているだろうが、で説明したように、それはエラーの原因となっているところで

question。したがって、JOINに移動しなければならなかった。希望 'JOIN'コードが複数よりも遅くないWHERE

+0

これはエラーを生成する正確なコードですか?あなたはそれを共有できますか? – Aheho

+0

@Ahehoはい、私は変数名を変更しました。 –

答えて

0

LINQがあなたのコードをSQL文に変換することをすでに理解していると思います。あなたの2番目のクエリは、ほぼ

SELECT q1.* 
FROM Sometable q1 
    JOIN Sometable q2 ON q1.Id = q2.Id 
WHERE q1.Id > 30 AND q2.Name LIKE '%something%') 

たびに、2つのテーブル間の結合よりも速く結果を返します単一の選択のようなものになるでしょう

SELECT * FROM Sometable WHERE Id > 30 AND Name LIKE '%something%' 

:あなたの最初のクエリは次のようになります。

LINQステートメントでテーブルを追加できない場合は、テーブルを追加していることを確認してください。

var queryable = db.Sometable.Include(i => i.ForeignTable).Where(x=> x.Id > 30); 
+0

質問を編集して詳細を追加しました。** NOTE **のセクションを確認してください –

2

私はちょうど1000万行のMSSQL 2008データベースのテーブルに対して同様のLINQ文を実行してみました。私は、クエリオプティマイザが両方のステートメントを同様のクエリプランに変換し、パフォーマンスの違いが洗い流されていることがわかりました。

私は、コードを読んでいる人として、最初の例ではあなたの意図をより明確に述べているので、それが望ましいと言います。多くの場合、パフォーマンスはコードを評価する際に選択するための最良の指標ではありません。

+0

詳細を追加するために質問を編集しました。 ** NOTE **のセクションを確認してください –

0

私はあなたがとにかく生成されたSQLクエリ

db.context.Database.Log = System.Diagnostic.Debug.WriteLine; 

を見るためにあなたのdbcontextにログを追加することができますwhere句、同じテーブルに参加し、自己に回避し、コードをより明確に

のために行くwhould私は希望クエリのパフォーマンスを向上させる:

  1. は、あなたが実際に(*ではない)必要がある唯一のフィールドを選択

  2. テーブルのインデックスを確認

  3. 本当にcontainsステートメントが必要ですか?レコードが大きくなると、SQLの「%XXX%」のようなパフォーマンス上の問題が発生します。
+0

詳細を追加するために質問を編集しました。 ** NOTE **セクションを確認してください –

関連する問題