Фильтрация IQueryable возвращает неверные результаты - PullRequest
0 голосов
/ 21 мая 2019

У меня есть метод, который принимает IQueryable<T> в качестве параметра с именем attachments. Внутри этого метода я фильтрую запрос далее по нескольким if операторам. Итак, мой код выглядит следующим образом:

if(firstCondition)
{
   attachments = attachments.Where(i => i.TestItemId == 1); //3 records in db
   DoWork(attachments);
}
if(secondCondition)
{
   attachments = attachments.Where(i => i.TestItemId == 2); //2 records in db
   DoWork(attachments);
}
...

Внутри DoWork(); Я делаю:

foreach(var items in attachments)
{
   //write attachment name to file here
}

В базе данных у меня в общей сложности 5 записей, которые внутри первого оператора if возвращают соответствующие результаты. Однако во втором if состоянии я получаю 0 результат обратно в запросе. Может кто-нибудь сказать мне, где я иду не так, пожалуйста.

Обратите внимание, что оба условия будут выполнены.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Объединение условий

Проблема связана с назначением, вызывающим объединение клаузул Where.

attachments = attachments.Where(i => i.TestItemId == 1);
attachments = attachments.Where(i => i.TestItemId == 2);

Следующий код такой же, как указано выше:

attachments.Where(i => i.TestItemId == 1).Where(i => i.TestItemId == 2);

Если вы удалите attachments = из обоих ifs, у вас не возникнет никаких проблем.

if(firstCondition)
{
   DoWork(attachments.Where(i => i.TestItemId == 1));
}

if(secondCondition)
{
   DoWork(attachments.Where(i => i.TestItemId == 2));
}
1 голос
/ 21 мая 2019

Не следует назначать вложения для первого условия, результат будет отфильтрован по 2 условиям: TestItemId == 1 && TestItemId == 2. => Он всегда возвращает пустой список;

...