У меня есть хранимая процедура в моей БД, которая позволяет мне отправлять нули в качестве параметров. Если значение равно null, то оно используется в инструкции where. Однако мне не нужно запрашивать базу данных во второй раз, потому что у меня есть данные в списке привязки.
Я пытался выяснить способ выполнения той же задачи в инструкции Linq. Ниже приведен код Linq, который у меня есть. Иногда имя задания или номер задания могут быть пустыми. Есть ли способ включить оператор, чтобы сказать if not empty, use it в предложении where? Пока единственный способ заставить его работать - это сделать глубокий if/else оператор. Я смотрел вокруг, и похоже, что единственный способ сделать это - с помощью выражения лямбда, а не Linq? Но я не знаю, как это сделать со списком привязки?
t = new BindingList<Tracking>(
OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
&& o.Created <= dateTo.Value
&& o.JobNumber.Contains(txtFilterJobNumber.Text)
&& o.JobName.Contains(txtFilterJobName.Text)
).ToList());
Объединив операцию IsNullOrEmpty с фактическим предложением:
t = new BindingList<Tracking>(
OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
&& o.Created <= dateTo.Value
&& (string.IsNullOrEmpty(txtFilterJobNumber.Text) || o.JobNumber.Contains(txtFilterJobNumber.Text))
&& (string.IsNullOrEmpty(txtFilterJobName.Text) || o.JobName.Contains(txtFilterJobName.Text))
).ToList());
Вы можете избежать необходимости записывать условия с помощью операторов нулевого распространения и нулевого коалесцирования:
OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
&& o.Created <= dateTo.Value
&& (o.JobNumber?.Contains(txtFilterJobNumber.Text) ?? true)
&& (o.JobName?.Contains(txtFilterJobName.Text) ?? true)
).ToList());
Если o.JobNumber равно null, то эта часть предложения эффективно пропущена (сделана правда). Аналогично для o.JobName.