子句可选条件

我正在使用 LINQtoSQL 查询,遇到了一个问题,我有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 });
}

现在我需要添加以下字段/过滤器,但只有在用户提供的情况下。

  1. Product Number-来自另一个可以连接到 TagsHeader 的表。
  2. PO Number-TagsHeader 表中的一个字段。
  3. 订单号-类似于 PO # ,只是不同的列。
  4. 产品状态-如果用户从下拉列表中选择了这个值,需要在这里应用选择的值。

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

93721 次浏览

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

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

这样,如果没有输入产品编号,那么表达式在所有情况下都会返回 true,但是如果输入了,那么在匹配时只会返回 true。

你有这个能力。

看看这个帖子,它可能会给你一些很好的建议: C # LINQ 相当于一个有点复杂的 SQL 查询

您可以对原始查询进行编码:

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;
}