Использование кортежа или другого сложного типа в запросе Linq-to-Entities выражение

Итак, я хочу найти в таблице клиентов всех клиентов, у каждого из которых есть имя, адрес электронной почты или номера телефонов, соответствующие всем ключевым словам запроса.

... Что, вероятно, легче понять в код, чем на английском языке:

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;
}

Но я не могу вызвать PhoneNumber.Pack в базе данных, поэтому мне нужно сделать w формат, который будет хранить как исходное значение w , а также значение ed Pack , и я должен делать это на стороне клиента. Проблема в том, что Linq не нравится наличие кортежей или массивов в аргументах выражения, и он не поддерживает String.IndexOf , поэтому я не могу объединить две строки в одну и затем взять подстроки.

Есть ли другие способы обойти это? Или, может быть, повторная формулировка запроса?

Редактировать: Сгенерированный SQL-запрос выглядит следующим образом:

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)
))
5
задан Rei Miyasaka 9 January 2011 в 16:41
поделиться