(以前の質問、Recursively (?) compose LINQ predicates into a single predicateはこれに似ていますが、実際には間違った質問をしました...そこでの解決策は提起された質問を満たしましたが、実際には私が必要としているものではありません。違いますが、正直です。)
次の検索テキストがあるとします。
"keyword1 keyword2 ... keywordN"
私は次のSQLで終わりたい:
SELECT [columns] FROM Customer
WHERE (
Customer.Forenames LIKE '%keyword1%'
OR
Customer.Forenames LIKE '%keyword2%'
OR
...
OR
Customer.Forenames LIKE '%keywordN%'
) AND (
Customer.Surname LIKE '%keyword1%'
OR
Customer.Surname LIKE '%keyword2%'
OR
....
OR
Customer.Surname LIKE '%keywordN%'
)
事実上、検索テキストをスペースで分割し、各トークンをトリミングし、それぞれに基づいてマルチパート OR 句を作成し、句を AND 結合します。
私はこれをLinq-to-SQLで行っていますが、サブ述語の任意の長いリストに基づいて述語を動的に作成する方法がわかりません。句の数がわかっている場合、述語を手動で構成するのは簡単です。
dataContext.Customers.Where(
(
Customer.Forenames.Contains("keyword1")
||
Customer.Forenames.Contains("keyword2")
) && (
Customer.Surname.Contains("keyword1")
||
Customer.Surname.Contains("keyword2")
)
);
要するに、2 つの述語が与えられた場合に、指定された演算子を使用して 2 つのソース述語を構成する単一の述語を返す手法が必要ですが、Linq-to-SQL で明示的にサポートされている演算子に限定されます。何か案は?