c# - LINQ to SQL Where 子句可选条件

标签 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. 产品编号 - 来自另一个可以连接到 TagHeaders 的表。
  2. PO 编号 - TagHeaders 表中的一个字段。
  3. 订单号 - 与 PO # 类似,只是列不同。
  4. 产品状态 - 如果用户从下拉列表中选择了此项,则需要在此处应用所选值。

我已有的查询运行良好,但要完成该功能,需要能够在 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/

相关文章:

c# - String.Format 与 string.Format 的对比。有什么问题吗?

asp.net - 在 VS 2005 中启动调试时 w3wp 崩溃

asp.net - 我可以避免 UpdatePanel 杀死 View 状态吗?

c# - 按结果将 Linq 组映射到对象

c# - 通过传递 .config 文件的路径将键/值对读取到字典中 c#

c# - Linq 中的空引用异常

c# - 多任务 Java 的分段排列

c# - 如何使用 WebResponse 下载 .wmv 文件

c# - 从 MySql 返回最后插入的 id

c# - 更改启动页