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