(Eine frühere Frage, LINQ-Prädikate rekursiv (?) zu einem einzigen Prädikat zusammensetzen ist ähnlich wie diese, aber ich habe eigentlich die falsche Frage gestellt... die Lösung dort erfüllte die gestellte Frage, ist aber eigentlich nicht das, was ich brauche. Sie sind aber unterschiedlich. Ehrlich.)
Geben Sie den folgenden Suchtext ein:
"keyword1 keyword2 ... keywordN"
Ich möchte die folgende SQL-Datei erhalten:
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%'
)
Wir teilen den Suchtext an Leerzeichen auf, schneiden jedes Token ab, konstruieren eine mehrteilige ODER-Klausel auf der Grundlage jedes Tokens und verknüpfen dann die Klauseln mit UND.
Ich tue dies in Linq-to-SQL, und ich habe keine Ahnung, wie man dynamisch ein Prädikat auf der Grundlage einer beliebig langen Liste von Unterprädikaten komponieren. Für eine bekannte Anzahl von Klauseln, ist es einfach, die Prädikate manuell zu komponieren:
dataContext.Customers.Where(
(
Customer.Forenames.Contains("keyword1")
||
Customer.Forenames.Contains("keyword2")
) && (
Customer.Surname.Contains("keyword1")
||
Customer.Surname.Contains("keyword2")
)
);
Kurz gesagt, ich brauche eine Technik, die bei zwei Prädikaten ein einzelnes Prädikat zurückgibt, das die beiden Quellprädikate mit einem bereitgestellten Operator zusammensetzt, aber auf die von Linq-to-SQL ausdrücklich unterstützten Operatoren beschränkt ist. Hat jemand eine Idee?