LINQ to SQL Where子句可选标准

时间:2009-03-10 21:50:09

标签: c# asp.net linq linq-to-sql

我正在使用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 });
    }

现在我需要添加以下字段/过滤器,但前提是它们是由用户提供的。

  1. 产品编号 - 来自另一个可以加入TagsHeaders的表。
  2. 采购订单编号 - TagsHeaders表中的一个字段。
  3. 订单号 - 与PO#类似,只是不同的列。
  4. 产品状态 - 如果用户从下拉列表中选择了此项,则需要在此处应用所选值。
  5. 我已经拥有的查询工作得很好,但要完成该功能,需要能够在where子句中添加这4个其他项,只是不知道如何!

3 个答案:

答案 0 :(得分:120)

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

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。也适用于初始查询的查询语法和辅助过滤器的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;
}

答案 1 :(得分:31)

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

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

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

答案 2 :(得分:0)

您可以使用||。

进行OR

查看这个帖子,因为它可能会给你一些不错的指示: C# LINQ equivalent of a somewhat complex SQL query