我正在使用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 });
}
现在,我需要添加以下字段/过滤器,但前提是它们是由用户提供的。
表中的一个字段。
我已经有的查询运行得很好,但是为了完成这个功能,需要能够在where子句中添加这4个其他项,只是不知道怎么做!
发布于 2009-03-10 22:14:30
您可以编写原始查询的代码:
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;
}
发布于 2009-03-10 21:55:48
只需要使用条件检查参数的存在。例如:
where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber)
这样,如果没有输入产品编号,则该表达式在所有情况下都将返回true,但如果输入了,则仅在匹配时返回true。
发布于 2009-03-10 21:57:48
您可以与||进行OR运算。
看看这个帖子,因为它可能会给你一些很好的提示:C# LINQ equivalent of a somewhat complex SQL query
https://stackoverflow.com/questions/632434
复制相似问题