0

を使用する検索エンジンを Web サイトに実装しましたLinq-To-Sql。エンジンの出力は のリストですResult
セキュリティとパフォーマンスを向上させるCachedResultために、データベースにテーブルを追加しました。次の列がありました:
ID, Date,は、別のテーブルの s でOutput
あるリストOutputを表す文字列です。 メソッドを使用して、データベースからそれらの要素を抽出することができました。問題は、それらの順序が、文字列内の順序ではなく、テーブル内の順序に基づいていることです。 したがって、この方法でメソッドを追加しました。これは(データベースから抽出された)のリストです。 問題は、例外がスローされることです。integersID
Whereintegers
OrderBy
db.Uploads.Where(upl => W.Contains(upl.UploadID)).OrderBy(pp => W.IndexOf(pp.UploadID)); Wintegers
Linq-To-Sql translatorList.IndexOfメソッドを適切な SQL クエリに変換できません。

私はこれを正しく行っていて解決策があるのか​​ 、それとも完全に間違っていて別の方法を探す必要があるのか​​ を知りたいですか? (つまり、 と関係を持つ別のテーブルを作成するCachedResults)

4

1 に答える 1

2

並べ替えの前に結果をリストとして実現できるため、並べ替えに Linq-To-Sql の代わりに Linq-To-Objects を使用できます。

db.Uploads
  .Where(upl => W.Contains(upl.UploadID))
  .ToList()
  .OrderBy(pp => W.IndexOf(pp.UploadID));

ただし、これはあまり効率的ではありません。メソッドはIndexOfO(n) 演算であるため、ソートは O(n 2 ) 演算になります。

CachedResultItems別の解決策は、次のようなフィールドを含む、キャッシュされた結果ごとに整数用の別のテーブルを追加することです。

ID       int
Ouptut   int
Position int

5,7,12,26,81テーブルのように文字列を格納する代わりに、CachedResultこれらのレコードをテーブルに格納しCachedResultItemsます (テーブルの ID 42 の場合CachedResult)。

ID   Output  Position
---- ------- ---------
42   5       1
42   7       2
42   12      3
42   26      4
42   81      5

次に、2 つのテーブルを結合し、結果を で並べ替えることができますPosition

これは、最初に 1 つの結果を取得して文字列をリストに分割し、そのリストをクエリで使用するよりも高速です。これは単一のクエリであり、インデックスをより効率的に使用できるからです。

于 2012-07-13T21:57:47.597 に答える