Итак, я хочу найти в таблице клиентов всех клиентов, у каждого из которых есть имя, адрес электронной почты или номера телефонов, соответствующие всем ключевым словам запроса.
... Что, вероятно, легче понять в код, чем на английском языке:
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)
))