首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ to SQL Where子句可选条件

LINQ to SQL Where子句可选条件
EN

Stack Overflow用户
提问于 2009-03-10 21:50:09
回答 3查看 92.4K关注 0票数 72

我正在使用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. 产品编号-来自可与column.
  2. Product编号联接的另一个表-

表中的一个字段。

  1. 订单编号-类似于PO #,只是状态不同-如果用户从下拉列表中选择此编号,则需要在此处应用选定的值。

我已经有的查询运行得很好,但是为了完成这个功能,需要能够在where子句中添加这4个其他项,只是不知道怎么做!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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;
}
票数 124
EN

Stack Overflow用户

发布于 2009-03-10 21:55:48

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

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

这样,如果没有输入产品编号,则该表达式在所有情况下都将返回true,但如果输入了,则仅在匹配时返回true。

票数 31
EN

Stack Overflow用户

发布于 2009-03-10 21:57:48

您可以与||进行OR运算。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/632434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档