C#linq在where语句中使用空字符串或空字符串

时间:2018-08-13 11:36:47

标签: c# linq lambda

我在数据库中有一个存储过程,该存储过程使我可以将空值作为参数发送。如果该值为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());

3 个答案:

答案 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也是如此。