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

C#linq在where语句中使用null或空字符串,c#,linq,lambda,C#,Linq,Lambda,我的数据库中有一个存储过程,允许我将空值作为参数发送。如果该值为null,则在where语句中使用它。但是,我不需要再次查询数据库,因为我在绑定列表中有数据 我一直在试图在Linq语句中找到完成相同任务的方法。下面是我现在拥有的Linq代码。有时作业名称或作业编号可能为空。有没有办法在where子句中包含一个操作符,表示如果不为空,请使用它?到目前为止,我让它工作的唯一方法是有一个深入的if/else语句。我环顾四周,看起来唯一的方法是使用lambda表达式,而不是Linq?但我不知道如何通过一

我的数据库中有一个存储过程,允许我将空值作为参数发送。如果该值为null,则在where语句中使用它。但是,我不需要再次查询数据库,因为我在绑定列表中有数据

我一直在试图在Linq语句中找到完成相同任务的方法。下面是我现在拥有的Linq代码。有时作业名称或作业编号可能为空。有没有办法在
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());
t=新绑定列表(
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.通过将IsNullOrEmpty chack与实际子句组合创建:

 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());
t=新绑定列表(
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.通过将IsNullOrEmpty chack与实际子句组合创建:

 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());
t=新绑定列表(
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.Created您可以通过使用空传播和空合并运算符避免写出条件:

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());
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.Created您可以通过使用空传播和空合并运算符避免写出条件:

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());
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.创建这取决于您使用的是哪种风格的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());
var t=新绑定列表(
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.创建这取决于您使用的是哪种风格的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());
var t=新绑定列表(
OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value

&&o.创建而不是一个包含
&
Where
子句,使用多个
Where
子句。
var query=OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value&&o.Created o.JobNumber.Contains(txtFilterJobNumber.Text))}
等。与其使用一个包含
&
Where
子句,不如使用多个
Where
子句。
var query=OmanWorkflow.TrackingData.Where(o=>o.Created>=dateFrom.Value&&o.Created o.JobNumber.Contains(txtFilterJobNumber.Text))}
等看起来简洁,但如果
跟踪数据
IQueryable
?。
运算符在表达式树中不受支持)。看起来简洁,但如果
跟踪数据
IQueryable
?。
运算符在表达式树中不受支持)则不起作用。回答得好。只需添加EF核心就足够聪明,可以消除常量
true
表达式。尽管第二种方法适用于任何LINQ实现,无论是
IEnumerable
还是
IQueryable
还是不够聪明。回答得好。只需添加EF核心就足够聪明,可以消除常量
true
表达式。尽管第二种方法适用于任何LINQ实现,即
IEnumerable
IQueryable
和聪明或不够聪明。