LINQ to SQL Where子句可选标准

我正在使用LINQ to SQL查询,并遇到了一个问题,我有4个可选字段来过滤数据结果。 通过可选,我的意思是可以select是否input一个值。 具体来说,几个文本框可以有一个值或有一个空string和一些下拉列表,可能有一个值select或可能不…

例如:

using (TagsModelDataContext db = new TagsModelDataContext()) { var query = from tags in db.TagsHeaders where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE select tags; this.Results = query.ToADOTable(rec => new object[] { query }); } 

现在我需要添加下面的字段/filter,但只有当它们是由用户提供的。

  1. 产品编号 – 来自另一个可以join到标签头的表。
  2. 采购订单编号 – 标签头表中的一个字段。
  3. 订单编号 – 与PO#类似,只是不同的列。
  4. 产品状态 – 如果用户从下拉列表中select此项,则需要在此处应用选定的值。

我已经有的查询工作是伟大的,但要完成的function,需要能够在where子句中添加这4个其他项目,只是不知道如何!

您可以编写原始查询:

 var query = from tags in db.TagsHeaders where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE select tags; 

然后基于一个条件,添加其他的约束。

 if(condition) query = query.Where(i => i.PONumber == "ABC"); 

我不知道如何用查询语法来编码,但ID确实与lambda一起工作。 也适用于初始查询的查询语法和二级filter的lambda。

你也可以包括一个扩展方法(下面),我编写了一段时间,包括有条件的where语句。 (对查询语法不起作用):

  var query = db.TagsHeaders .Where(tags => tags.CST.Equals(this.SelectedCust.CustCode.ToUpper())) .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE) .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE) .WhereIf(condition1, tags => tags.PONumber == "ABC") .WhereIf(condition2, tags => tags.XYZ > 123); 

扩展方法:

 public static IQueryable<TSource> WhereIf<TSource>( this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) { if (condition) return source.Where(predicate); else return source; } 

这里是IEnumerables的扩展方法:

 public static IEnumerable<TSource> WhereIf<TSource>( this IEnumerable<TSource> source, bool condition, Func<TSource, bool> predicate) { if (condition) return source.Where(predicate); else return source; } 

只需要使用条件检查参数的存在。 例如:

 where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber) 

这样,如果没有input产品编号,则expression式在所有情况下都将返回true,但是如果input了,则匹配时只返回true。

你有能力与||或。

看看这个线程,因为它可能会给你一些不错的指针: C#LINQ相当于一个有点复杂的SQL查询