Построение запроса в цикле со странным каркасом сущностей - PullRequest
6 голосов
/ 21 марта 2011

Я сделал этот метод поиска в моем репозитории Entity Framework:

public IEnumerable<Person> GetPersonsWithFilter(string filter)
{
    var items = 
        filter.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    var query = _personRepo.All();  // Return IQueryable<Person>

    foreach (var item in items)
    {
        query = query.Where(i => i.SearchName.Contains(item.ToLower()));
    }

    query.TraceSql(i => Logger.Error(i));
    return query.Take(50);
}

TraceSql выводит полученный sql.Если мой фильтр «Джон Ландхир», sql генерируется правильно:

SELECT   [Extent1].[PersonId] AS [PersonId] // Other fields deleted for readability
FROM [dbo].[Person] AS [Extent1]  
WHERE 
(( CAST(CHARINDEX(LOWER(@p__linq__0), [Extent1].[SearchName]) AS int)) > 0) 
AND 
(( CAST(CHARINDEX(LOWER(@p__linq__1), [Extent1].[SearchName]) AS int)) > 0)  

НО, параметры такие же: @ p_ linq _0 = 'landheer' и @ p_ linq _1 = 'landheer'

Теперь, если я изменю цикл следующим образом:

foreach (var item in items)
{
    var tempItem = item;
    query = query.Where(i => i.SearchName.Contains(tempItem.ToLower()));
}

Все работает?!?!

Я предполагаюэто как-то связано с тем, как EF создает дерево выражений, но выглядит немного неожиданно.Кто-нибудь может пролить свет на это?

Джон

1 Ответ

0 голосов
/ 21 марта 2011

Спасибо, Equiso, я не нашел вопрос, на который ты ссылался. Таким образом, это точная копия запроса Linq, встроенного в цикл foreach, всегда принимает значение параметра из последней итерации .

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