2


SQLユーザーが入力したクエリをデータベース で検索するWebアプリケーションを構築しています。シンプルな検索エンジン。
数千を超える行がたくさんあることを提案しましょう。通話を効率的にしたい。
私の呼び出しは1つの*SQLクエリで可能であることを知っています。Linq-To-Sqlこの種の最適化が行われるかどうか知りたいのですが。
私はそれがLazyそのクエリに使用することを知っています。データベースに十分なデータがないため、現在ベンチマークを実行できません。

    foreach(var word in words)
    {
        var niqquh = number == 666 ? "" : Languages[number];
        var S = db.Uploads.Where(w => number == 666 ? true : (w.Language == niqquh));
        if(S.Count() > 20)
            S = S.Take(20);
        S = S.OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0));
        listOfList.Add(S.ToList());
    }


666ここにあるように、私は「どんな言語でも大丈夫」と言うために使用される 「マジックナンバー」を持っています。
次に、上位20個の要素のみを取得したいので、を呼び出しCount()てからTake
次に、必要に応じて結果を並べ替えます。
重要なのは、式はで評価されると思うということです。したがって、レベルで上位20行のみを含むように最適化することはできませんが、クライアント(ASP.NET)レベルで評価されます。したがって、私は基本的にデータベース全体をクライアントにダウンロードしますが、これはひどいことです。最適化されているかどうか、そうでない場合は、プレーンな文字列ステートメントに戻らなければならない場合でも、どうすれば効率的な方法でそれを行うことができますか? *それぞれのクエリlazyCountSQL Query

SQL

word

4

2 に答える 2

5

そうです、カウントを取得するにはステートメントを実行する必要があります。ただし、カウントを確認する必要はありません。だから、変更

if(S.Count() > 20)             
    S = S.Take(20); 

S = S.Take(20); 

次のように書き直すことができます。

foreach(var word in words)
{
    var niqquh = number == 666 ? "" : Languages[number];
    var S = db.Uploads.Where(w => number == 666 || w.Language == niqquh)
        .Take(20)
        .OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0));
    listOfList.Add(S.ToList());
}
于 2012-07-12T19:19:05.113 に答える
3
if(S.Count() > 20) 

これはクエリを実行します、はい...

SELECT COUNT(*) FROM

したがって、テーブル全体をダウンロードしませんでした。


S = S.Take(20);

これはクエリを実行しません。(順序付けされていない)クエリは20アイテムに制限されます。通常、結果を制限する前に注文を適用する必要があります。

あなたがそこにあるより多くを取るならば、例外はありません。取得するアイテムが少なくなります。このため、カウントは必要ありません。


S.ToList();

これにより、クエリが実行されます。


IQueryable<Upload> query = db.Uploads;
if (number != 666)
{
   var niqquh = Languages[number];
   query = query.Where(w => w.Language == niqquh);
}
query = query
  .OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0))
  .Take(20);
listOfList.Add(query.ToList()); 
于 2012-07-12T19:26:51.040 に答える