Использование Linq To SQL для поиска нескольких строк в поле - PullRequest
1 голос
/ 06 декабря 2010

Я пытаюсь использовать Linq to SQL для поиска в текстовом столбце нескольких подходящих слов, но запрос не выполняет то, что я ожидаю.

Вот пример кода:

            string[] nameSearch = new string[2];
            nameSearch[0] = "John";
            nameSearch[1] = "Doe";

            var customers = context.Customers.AsQueryable();
            foreach (string name in nameSearch)
            {
                customers = customers.Where(r => r.CustName.Contains(name));
            }
            Data.Customer[] results = customers.ToArray();

Запускаемый запрос:

    SELECT [t0].[CustName]
    FROM [dbo].[Customer] AS [t0]
    WHERE ([t0].[CustName] LIKE @p0) AND ([t0].[CustName] LIKE @p1)
    -- @p0: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [%Doe%]
    -- @p1: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [%Doe%]

Как мне исправить этот запрос?(Предполагается, что он ищет Джона и Доу, а не Доу и Доу.)

Ответы [ 4 ]

4 голосов
/ 06 декабря 2010

Ваше лямбда-выражение оценивается только при выполнении запроса, т. Е. Во время вызова ToArray(). К тому времени name будет привязан к последнему элементу в вашем массиве.

Вы можете использовать локальную переменную в цикле foreach, чтобы избежать ссылки на внешнюю переменную name в лямбда-выражении:

var customers = context.Customers.AsQueryable();
for (string name in nameSearch) {
    string curName = name;
    customers = customers.Where(r => r.CustName.Contains(curName));
}
Data.Customer[] results = customers.ToArray();
2 голосов
/ 06 декабря 2010

Ответ:

foreach (string name in nameSearch)
{
    string name_ = name;
    customers = customers.Where(r => r.CustName.Contains(name_));
}

Объяснение:

Лямбда-функция r => r.CustName.Contains(name) захватывает переменную name. Эта же переменная находится в области действия для обеих итераций. Использование временной области блока разрывает эту ссылку, так что каждый вызов лямбда-функции выбирает другую переменную с различным значением.

1 голос
/ 06 декабря 2010
string[] nameSearch = new string[2];
nameSearch[0] = "John";
nameSearch[1] = "Doe";


var result = customers.Where(r => nameSearch.Contains(r.CustName));
0 голосов
/ 06 декабря 2010

Нет, вышеприведенное неверно, оно будет перезаписывать клиентов каждый раз!

клиенты = клиенты. Где (r => r.CustName.Contains ("Джон") && r.CustName.Contains ("Доу"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...