Я использую LINQ для извлечения записей из базы данных. Все работает нормально, за исключением того, что мне нужно применить разные фильтры в одном запросе. Если параметры не равны нулю и больше нуля, тогда применяются фильтры. В противном случае, если они равны нулю или нулю, не применяйте фильтры. Ниже приведен пример:

bankId(int) and accountNumber(string) are my two parameters.
if bankId > 0 then get the records matching the bankId, if accountnumber is passed then get the records matching the accountnumber.
If both are passed pull all the records matching with bankid and accountnumber.
If both are not passed then return all records without applying filter.

В настоящее время я могу добиться этого следующим образом: без применения какого-либо фильтра я извлекаю все записи, а затем, если передается bankId, применяя фильтр к вышеуказанному результату, и если номер счета передается снова, применяя фильтр к вышеуказанному результату.

Но проблема здесь в том, что этот подход приводит к множеству условий if, которых я не хочу.

Есть ли лучший и простой способ применить эти фильтры в одном запросе и получить результат?

Пожалуйста, предложите, спасибо заранее.

1
Meena 3 Фев 2022 в 16:14
1
Есть несколько повторяющихся вопросов. Вы не можете связать методы LINQ для создания новых запросов по мере необходимости. Вы можете проверить, имеет ли параметр значение, и вызвать query=query.Where(...), чтобы добавить еще одно условие WHERE, эффективно объединив их.
 – 
Panagiotis Kanavos
3 Фев 2022 в 16:16
Сделайте это, как я сделал это в своем вопросе: stackoverflow.com/questions/23674778/… Используйте несколько Where. Важно: не выполняйте запрос в if, например, с ToList.
 – 
Tim Schmelter
3 Фев 2022 в 16:18
1
leading to multiple if conditions which I don't want. что это значит? Как выглядит ваш код? Вы можете заменить несколько if выражением переключения. С другой стороны, здесь нужны только два if
 – 
Panagiotis Kanavos
3 Фев 2022 в 16:18
Наряду с проблемой вы должны включить код, который у вас был до этого момента (приложить некоторые усилия, чтобы ответить на вашу проблему/вопрос как Stack Overflow не является службой написания кода). После дополнительных исследований, если у вас возникнут проблемы, вы можете опубликовать свои попытки с помощью четкое объяснение того, что не работает, и предоставление минимально воспроизводимого примера . Я предлагаю прочитать Как задать хороший вопрос и Как составить идеальный вопрос.
 – 
Igor
3 Фев 2022 в 16:20

2 ответа

Строить свое заявление таким образом

var items = context.accounts.AsQueryable();
if (bankId > 0)
{
    items = items.Where(x => x.bankId == bankId);
}
if (!string.IsNullOrEmpty(accountnumber))
{
    items = items.Where(x => x.accountnumber == accountnumber);
}
var result = items.ToList(); // query db / materialize here!
1
fubo 3 Фев 2022 в 16:22

Вы можете отправить функцию в условие и отфильтровать ее, как показано ниже.

List items = getItemsAslist();
    
    Func<item, bool> filterAccounts = (i) => 
        {
            return (bankId > 0 ? i.bankId == bankId : true) 
                   && (!string.IsNullOrEmpty(accountnumber) ? accountNumber == i.accountNumber : true)
        };
    
    items = items.Where(filterAccounts);
0
Sadik 3 Фев 2022 в 16:53
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте, чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
 – 
Community
3 Фев 2022 в 17:13