問題文
人の名前を検索するクエリがあるとします。
var result = (from person in container.people select person)
.Where(p => p.Name.Contains(some_criterion)
これは、次のような句を含むSQLクエリに変換されます。
WHERE NAME LIKE '%some_criterion%'
データベースが名前列のインデックスを効果的に使用できないため、これにはパフォーマンスに影響があります(間違っていない場合は、インデックススキャンとインデックスシーク)。
これを修正するために、代わりにStartsWith()だけを使用して、次のようなlike句を使用してクエリを生成することを決定できます。
WHERE NAME LIKE 'some_criterion%'
これにより、SQLサーバーはインデックスシークを使用して、一部の機能を犠牲にしてパフォーマンスを提供できます。
ユーザーに選択肢を提供できるようにしたいと思います。デフォルトでStartsWithを使用するように動作しますが、ユーザーがContains()を使用して検索する「追加の柔軟性」が必要な場合は、それを使用する必要があります。
私は何を試しましたか
これは些細なことだと思い、続けて文字列に拡張メソッドを実装しました。ただし、もちろん、LINQはこれを受け入れず、例外がスローされます。
これで、もちろん、ifまたはswitchステートメントを使用して、それぞれのケースのクエリを作成できますが、これを「より高いレベルで」またはより一般的に解決したいと思います。つまり、実際のアプリケーションは複雑であるため、ifステートメントを使用してユースケースを区別することはできません。これは、多くの繰り返しと混乱につながるでしょう。さまざまな動作(Contains、StartsWith、EndsWith)をなんとかしてカプセル化できるようにしたいと思っています。
質問
どこを見ればいいですか、何を探すべきですか?これはIQueryablesとの構成可能性の場合ですか?私はかなり困惑しています!