2017-03-01 4 views
0

このクエリを最適化するのに問題があります。このLINQクエリを改善して、ユーザーがリスト内のすべてのスキルを見つける方法

特定のスキルを持つユーザーを除外します。

これらのスキルは、GUIDであるIDのリスト形式でサーバーに送信されます。

残念ながら、私が望むように簡単にユーザーを取得することはできません。これを行う最後の人がこれをSQLビューに配置したからです。

ここでは、すべてのスキルを選択したすべてのユーザーを検索して検索します。

skillIDsは、GUIDの

ここ

のリストである私はそれが働いている方法は非常に非効率的であると認識それは我々が

myView.Where(view => !skillIDs.Except(view.User.Skills.Select(skill => skill.ID).Any())) 

myview.Where(view => skillIDs.All(skill => view.User.Skills.Select(s => s.ID).contains(skill))) 

を試してみました

myview.Where(view => skillIDs.All(skill => view.User.Skills.Any(s => s.ID == skill))) 

他のもののように見えるもので、はい、私たちは結果を改ページしていますが、このクエリの後までは改行していません。私が考えているのは、実行するべきときである.skip(0).Take(10).tolist()を待つのではなく、ここでクエリを実行しているということです。今のところ、これが動作するには45秒かかります。上記のクエリを実行しようとしていないときは、1秒未満です。これが原因です。

+0

インデックスにはインデックスがありますか? –

+0

私はそうですが、SQLビューで実際にインデックスを作成することはできません –

+0

ビューにインデックスを持たないのはなぜですか? –

答えて

1

この場合、LINQのさまざまなバリエーションでの再生は、問題がLINQステートメントの作成方法ではなく、バックエンドテーブルの索引付けにある可能性があるため、違いはありません。それが直接ビューを

  • インデックスを必要とする場合、ビューは、テーブルの上にインデックスを使用することができるようになりますよう

    1. インデックスのバックエンドテーブル:あなたは本当に2つのオプションがあります。索引ビューの定義は決定論的でなければなりません。 MSDN

      MYVIEW上で一意クラスタ化インデックスIDX_V1
      (skillid)を作成します。
      GO

  • +0

    これはスキルIDがビューに存在せず、ナビゲーションアイテムをつかむために、それは全くインデックスされるものではない –

    +0

    スキルIDはスキルテーブルでインデックスされますが、 –

    +0

    私はあなたのLINQクエリに基づいて推測しました。この場合、インデックスを作成しているオプション#1はまだあります。 DBスキーマを持たずにどこにいなければならないのか正確に言うのは難しいです。私はおそらく '[スキル]'テーブルにあると思いますか? – bc004346

    関連する問題