(una precedente interrogazione, Recursively (?) compose LINQ predicates into a single predicate, è simile a questo, ma in realtà ho fatto la domanda sbagliata ... la soluzione non ha soddisfatto la questione posta, ma non è in realtà quello ho bisogno sono diversi, anche se onesto)Compose LINQ to SQL predicati in un unico predicato
Dato il seguente ricerca:...
"keyword1 keyword2 ... keywordN"
voglio finire con il seguente 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%'
)
In effetti, stiamo dividendo il testo di ricerca sugli spazi, rifilatura ogni token, la costruzione di un multi-parte clausola OR sulla base di ciascuno, e quindi AND'ing le clausole insieme.
Lo sto facendo in Linq-to-SQL e non ho idea di come comporre dinamicamente un predicato basato su un elenco arbitrario di subpredicati. Per un numero noto di clausole, è facile comporre i predicati manualmente:
dataContext.Customers.Where(
(
Customer.Forenames.Contains("keyword1")
||
Customer.Forenames.Contains("keyword2")
) && (
Customer.Surname.Contains("keyword1")
||
Customer.Surname.Contains("keyword2")
)
);
In breve, ho bisogno di una tecnica che, dati due predicati, restituirà un singolo predicato comporre i due sorgente predicati con un operatore fornito, ma limitato agli operatori esplicitamente supportati da Linq-to-SQL. Qualche idea?
Questo potrebbe essere un duplicato di: http://stackoverflow.com/questions/180405/how-do-you-add-dynamic-where-clauses-to-a-linq-query – devuxer
La query non ha molto senso ... Si vuole trovare clienti in cui il * nome * contiene almeno uno dei termini di ricerca e * Cognome * contiene almeno uno dei termini di ricerca, ecc.? La query non dovrebbe trovare i clienti che hanno * tutti * i termini di ricerca, ma in * qualsiasi * campo? – Timwi