我在数据库中有一个存储过程,该存储过程使我可以将空值作为参数发送。如果该值为null,则在where语句中使用它。但是,我不需要第二次查询数据库,因为我的数据在绑定列表中。
我一直试图在Linq语句中找到一种方法来完成相同的任务。以下是我现在拥有的Linq代码。有时,作业名称或作业编号可能为空。有什么方法可以在if not empty, use it
子句中包含运算符来说where
?到目前为止,使它起作用的唯一方法是使用深层的if/else
语句。我环顾四周,看来唯一的方法是使用Lambda表达式而不是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());
答案 0 :(得分:3)
这取决于您使用的是哪种Linq。如果是Linq To SQL,则只需:
var 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());
Linq To SQL足够聪明,可以检查txtFilterJobNumber \ Name是否为空\ null,是否还不将其包括在生成的where子句中。
但是,对于EF来说,故事却有所不同,并且if ...构造使用起来非常简单容易:
var td = OmanWorkflow.TrackingData.Where(o =>
o.Created >= dateFrom.Value && o.Created <= dateTo.Value);
// this likely should be o.Created < dateTo.Value
//
if (!string.IsNullOrEmpty(txtFilterJobNumber.Text))
{
td = td.Where(o.JobNumber.Contains(txtFilterJobNumber.Text));
}
if (!string.IsNullOrEmpty(txtFilterJobName.Text))
{
td = td.Where(o.JobName.Contains(txtFilterJobName.Text));
}
var t = new BindingList<Tracking>(td).ToList());
答案 1 :(得分:1)
通过将IsNullOrEmpty hack与实际子句结合:
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());
答案 2 :(得分:1)
您可以避免使用空传播和空合并运算符写出条件:
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,则该子句的该部分将被有效跳过(设为true)。 o.JobName
也是如此。