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