我正在使用LINQ to SQL查询,遇到了一个问题,我有4个可选字段来过滤数据结果.可选,我的意思是可以 Select 是否输入值.具体来说,一些文本框可能有一个值或一个空字符串,一些下拉列表可能有一个值被选中或可能没有...

例如:

    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. 产品号-来自可连接到标记标题的另一个表.
  2. 采购订单编号-TagsHeaders表中的一个字段.
  3. 订单号-类似于PO号,只是列不同.
  4. 产品状态-如果用户从下拉列表中 Select ,则需要在此处应用所选值.

我已经有的查询运行得很好,但是要完成这个功能,需要能够在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;
}

Asp.net相关问答推荐

如何使用 Get-Process powershell 命令通过端口号获取进程的 ID

.Net Framework:w3wp.exe 中的异常

如何将 viewbag 显示为 html?

在 C# 中以编程方式添加元标记

有没有办法将 onclick 事件添加到 ASP.NET 标签服务器控件?

在控制器 asp.net mvc 5 的视图上显示错误消息

如何从网页 (asp.net) 启动 EXE

由于缺少定义,在 .net Core 应用程序上构建失败

多个 DataContext 类是否合适?

相当于服务器端的 ASP.NET 包括

HTTP 错误 503.该服务在简单的 ASP.NET 4.0 网站下不可用

如何在 IIS 7.5 上使用 ASP.NET 表单身份验证保护静态文件?

这个rendersection的代码是什么意思?

应该如何使用 RedirectToRoute?

IIS url 重写角色,除了一些 url

回发后运行javascript函数

IsMobileDevice 是如何工作的?

ExecuteReader:连接属性尚未初始化

如何在服务器控件属性中使用 ASP.NET <%= 标签?

强制 IIS Express 进入classic 管道模式