IQueryable WHERE внутри цикла for не дает ожидаемого результата - PullRequest
0 голосов
/ 22 октября 2019

Цель:

Внедрение И фильтра. Когда пользователи вводят список ключевых слов во входные данные, тогда список фильтруется на основе первого слова, затем следующего и так далее. Например, когда они вводят «май», их список должен быть отфильтрован, чтобы показывать только записи за майский месяц. Если они вводят «Май-июнь», они должны получить пустой список. Потому что вы не должны найти записи за июнь месяц в списке за май месяц

Моя неудачная попытка:

В приведенном ниже примере нетработа, как я ожидал,

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, он не работает. Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 22 октября 2019

проблема должна быть из-за использования одной и той же переменной entityObj

Прежде всего, entityObj является правильным IQueriable? это означает, что это просто запрос, а не коллекция или список

во-вторых, не используйте эту же переменную для хранения результата

, вместо этого попробуйте это, он должен работать нормально

string searchTerm = "May";
var mainList= entityObj.Where(x =>
            x.Month.ToLower().Contains(searchTerm) ||
            x.Year.ToString().ToLower().Contains(searchTerm) ||
            x.Product.ToLower().Contains(searchTerm)).ToList();

searchTerm = "June";
var subList= mainList.Where(x =>
            x.Month.ToLower().Contains(searchTerm) ||
            x.Year.ToString().ToLower().Contains(searchTerm) ||
            x.Product.ToLower().Contains(searchTerm));

Я уверен, что это должно сработать, но даже если это одна из последних работ, вы можете посмотреть, как c # ссылается на переменную, назначая выделение памяти

не заходит слишком глубоко, но есть методы shellowCoy и deepcopy. хочу посмотреть на это

https://www.geeksforgeeks.org/shallow-copy-and-deep-copy-in-c-sharp/

...