Построение запроса в цикле со странным поведением Entity Framework

Я использовал этот метод поиска в моем репозитории 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. Если мой фильтр - "John Landheer ", 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 строит дерево выражений, но это выглядит немного неожиданным. какой-нибудь свет на это?

Джон

6
задан Branislav Abadjimarinov 21 March 2011 в 17:22
поделиться