Componga predicados LINQ-to-SQL en un solo predicado

(Una pregunta anterior,Recursivamente (?) Componen predicados LINQ en un solo predicado, es similar a esto, pero en realidad hice la pregunta incorrecta ... la solución allí satisfizo la pregunta planteada, pero en realidad no es lo que necesito. Sin embargo, son diferentes. Honesto.)

Dado el siguiente texto de búsqueda:

"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 OR de varias partes basada en cada uno, y luego uniendo las cláusulas.

Estoy haciendo esto en Linq-to-SQL, y no tengo idea de cómo componer dinámicamente un predicado basado en una lista arbitrariamente larga de subpredicados. Para un número conocido de cláusulas, es fácil componer los predicados manualmente:

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, dados dos predicados, devolverá un solo predicado que componga los dos predicados fuente con un operador suministrado, pero restringido a los operadores explícitamente compatibles con Linq-to-SQL. ¿Algunas ideas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta