(Una pregunta anterior, Recursively (?) compose LINQ predicates into a single predicate, es similar a esto, pero en realidad hice la pregunta incorrecta ... la solución allí satisfizo la pregunta tal como se planteó, pero en realidad no es lo necesito son diferentes, aunque honesto)Componer predicados LINQ-to-SQL en un solo predicado
Dada la siguiente búsqueda de texto:...
"keyword1 keyword2 ... keywordN"
quiero terminar con el siguiente 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%'
)
Efectivamente, estamos dividiendo el texto de búsqueda en espacios, recortando cada token, construyendo una cláusula O de varias partes basada en cada uno, y luego AND 'las cláusulas juntas.
Estoy haciendo esto en Linq-to-SQL, y no tengo idea de cómo componer dinámicamente un predicado basado en una lista larga arbitrariamente de subpredicados. Para un número conocido de cláusulas, es fácil para componer los predicados de forma manual:
dataContext.Customers.Where(
(
Customer.Forenames.Contains("keyword1")
||
Customer.Forenames.Contains("keyword2")
) && (
Customer.Surname.Contains("keyword1")
||
Customer.Surname.Contains("keyword2")
)
);
En resumen, necesito una técnica que, dadas dos predicados, devolverá un solo predicado componer los dos fuente de predicados con un operador suministrado, pero restringido a los operadores explícitamente compatibles con Linq-to-SQL. ¿Algunas ideas?
Esto podría ser un duplicado de: http://stackoverflow.com/questions/180405/how-do-you-add-dynamic-where-clauses-to-a-linq-query – devuxer
Su consulta realmente no tiene sentido ... Quiere encontrar clientes donde * Forename * contiene al menos uno de los términos de búsqueda, y * Apellido * contiene al menos uno de los términos de búsqueda, etc. ¿No debería la consulta encontrar clientes que tienen * todos * los términos de búsqueda, pero en el campo * any *? – Timwi