我正在使用 LINQ to SQL 查询并遇到一个问题,我有 4 个可选字段来过滤数据结果。可选的,我的意思是可以选择是否输入值。具体来说,一些文本框可能有一个值或一个空字符串,还有一些下拉列表可能已经选择了一个值,也可能没有...
例如:
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 });
}
现在我需要添加以下字段/过滤器,但前提是它们由用户提供。
- 产品编号 - 来自另一个可以连接到 TagHeaders 的表。
- PO 编号 - TagHeaders 表中的一个字段。
- 订单号 - 与 PO # 类似,只是列不同。
- 产品状态 - 如果用户从下拉列表中选择了此项,则需要在此处应用所选值。
我已有的查询运行良好,但要完成该功能,需要能够在 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;
然后根据条件,添加额外的 where 约束。
if(condition)
query = query.Where(i => i.PONumber == "ABC");
我不确定如何使用查询语法对此进行编码,但 id 确实适用于 lambda。也适用于初始查询的查询语法和二级过滤器的 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;
}
关于c# - LINQ to SQL Where 子句可选条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632434/