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,但只有当它们是由用户提供的。
- 产品编号 – 来自另一个可以join到标签头的表。
- 采购订单编号 – 标签头表中的一个字段。
- 订单编号 – 与PO#类似,只是不同的列。
- 产品状态 – 如果用户从下拉列表中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查询