Así que quiero buscar dentro de una tabla de clientes todos los clientes que en cada uno tengan su nombre, dirección de correo electrónico o números de teléfono que coincidan con todos las palabras clave de consultaUsando una tupla o algún otro tipo complejo en una expresión de consulta Linq-to-Entities
... que es probablemente más fácil de entender en el código que en Inglés:
public IQueryable<Contact> SearchCustomers(string query)
{
var ws = from w in query.Split()
where !String.IsNullOrWhiteSpace(w)
select w;
var q =
from c in Customers
where ws.All(w =>
c.FirstName == w
|| c.LastName == w
|| c.EmailAddress == w
|| c.HomePhone == PhoneNumber.Pack(w)
|| c.CellPhone == PhoneNumber.Pack(w))
select c;
return q;
}
Pero no puedo llamar PhoneNumber.Pack
en la base de datos, por lo que necesito para hacer w
un formato que almacenará tanto la valor bruto de w
, así como el valor ed Pack
, y tengo que hacer eso en el lado del cliente. El problema es que a Linq no le gusta tener tuplas o matrices en los argumentos de expresión, y no admite String.IndexOf
, por lo que no puedo lanzar dos cadenas en una y luego tomar subseries.
¿Alguna otra forma de evitar esto? ¿O tal vez una reformulación de la consulta?
Editar: El SQL generado es el siguiente:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
(etc)
FROM [dbo].[Contacts] AS [Extent1]
WHERE (NOT EXISTS (SELECT
1 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
WHERE (NOT ([Extent1].[FirstName] = N'rei' OR [Extent1].[LastName] = N'rei' OR [Extent1].[EmailAddress] = N'rei' OR [Extent1].[HomePhone] = N'rei' OR [Extent1].[CellPhone] = N'rei')) OR (CASE WHEN ([Extent1].[FirstName] = N'rei' OR [Extent1].[LastName] = N'rei' OR [Extent1].[EmailAddress] = N'rei' OR [Extent1].[HomePhone] = N'rei' OR [Extent1].[CellPhone] = N'rei') THEN cast(1 as bit) WHEN (NOT ([Extent1].[FirstName] = N'rei' OR [Extent1].[LastName] = N'rei' OR [Extent1].[EmailAddress] = N'rei' OR [Extent1].[HomePhone] = N'rei' OR [Extent1].[CellPhone] = N'rei')) THEN cast(0 as bit) END IS NULL)
))
Por cierto, ¿cómo obtuviste el SQL generado? Profiler? –
http://anjlab.com/en/projects/opensource/sqlprofiler –