Цель:
Внедрение И фильтра. Когда пользователи вводят список ключевых слов во входные данные, тогда список фильтруется на основе первого слова, затем следующего и так далее. Например, когда они вводят «май», их список должен быть отфильтрован, чтобы показывать только записи за майский месяц. Если они вводят «Май-июнь», они должны получить пустой список. Потому что вы не должны найти записи за июнь месяц в списке за май месяц
Моя неудачная попытка:
В приведенном ниже примере нетработа, как я ожидал,
List<string> keywords; // e.g. "May", "June"
for (int i = 0; i < keywords.Length; i++) {
string searchTerm = keywords[i];
entityObj = entityObj.Where(x =>
x.Month.ToLower().Contains(searchTerm) ||
x.Year.ToString().ToLower().Contains(searchTerm) ||
x.Product.ToLower().Contains(searchTerm));
}
entityObj
имеет тип IQueryable<SomeEntity>
. Предположим, что в базе данных есть таблица со столбцами Месяц, Год и Продукт . На первой итерации searchTerm
будет иметь May в качестве значения. Таким образом, entityObj должен возвращать IQueryable
объект для записей, которые имеют только мая в столбце Месяц . Я ожидаю, что вторая итерация ничего не даст, так как мы ищем значение июня в результате предыдущей итерации, которая имеет только мая результат. Тем не менее, я получаю записи, которые имеют значение June . Независимо от того, сколько у меня ключевых слов, всегда возвращается результат, основанный на последнем элементе в списке, который является последней итерацией.
Когда я делаю ниже
string searchTerm = "May";
entityObj = entityObj.Where(x =>
x.Month.ToLower().Contains(searchTerm) ||
x.Year.ToString().ToLower().Contains(searchTerm) ||
x.Product.ToLower().Contains(searchTerm));
searchTerm = "June";
entityObj = entityObj.Where(x =>
x.Month.ToLower().Contains(searchTerm) ||
x.Year.ToString().ToLower().Contains(searchTerm) ||
x.Product.ToLower().Contains(searchTerm));
, я получаюрезультат, который я ожидаю, пустой список. Однако, когда я делаю это внутри цикла for, он не работает. Я что-то здесь упускаю?