【问题标题】:How to Filter Datatable with multiple column values using C#如何使用 C# 过滤具有多列值的数据表
【发布时间】:2014-06-12 12:39:10
【问题描述】:

我的网页上有 5 个控件,例如 txtFirstName(TextBox)、txtDisplayName(TextBox)、txtFromDate(TextBox)、txtToDate(TextBox) 和 btnFilter(button)。此外,我正在使用 DataTable 在 GridView 同一页面上绑定一些数据。

现在我想使用上面提到的这些搜索参数控件来过滤 DataTable。

过滤条件是,

  • 我们不确定填充控件和空控件。因此,根据在控件上输入的输入,我们需要过滤 DataTable。如果控件值为空,我们不应允许它们过滤 Datatable。

  • 我们需要通过 LIKE 运算符或 String.Startswith() 过滤数据值

  • 如果 txtFromDate 和 txtToDate 已经填满,那么我们需要过滤范围之间的数据值。

  • 如果所有控件都已填充,那么我们需要根据日期范围内的所有过滤器参数过滤数据表。

我们如何实现这种过滤?请帮助我成功实现这一点。 我们可以通过 LINQ 或 Lamda 表达式来做到这一点吗?如果有,请告诉我建议。

我尝试了两种方法,但都不起作用,

第一种方式:

var test=dtActions.AsEnumerable().Where(z=>
    !string.IsNullOrEmpty(txtFirstName.Text)? z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) &&
    !string.IsNullOrEmpty(txtDisplayName.Text)?z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper()) &&
    !string.IsNullOrEmpty(txtCreatedBy.Text)?z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper());

我不知道在 DateTime 文本框之间获取数据。

第二种方式:

var results = from dataRow in dtActions.AsEnumerable()
    where dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||
        dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||  
        ((dataRow.Field<DateTime>("CreatedDate")>= Convert.ToDateTime(txtFromDate.Text)) && (dataRow.Field<DateTime>("CreatedDate")<= Convert.ToDateTime(txtToDate.Text)))
    select dataRow;

【问题讨论】:

  • 请发布您尝试过的代码。这样,我们可以检查它是否有错误,并提供替代解决方案
  • 使用类似dt.AsEnumerable().Where(x=&gt; x["id" ==1).ToList()
  • @kostasch。我们需要检查文本框是否为空并将过滤数据表。多个文本框控件值也是如此。
  • 与其在获取数据后进行过滤,不如使用传入存储过程的参数进行过滤? IE。其中 param = null 或 myfield = param。
  • 检查dt.AsEnumerable().Where(x=&gt; (!string.IsNullOrEmpty(txtSkata) ? x.description.Contains(txtSkata.Trim()) : "0" == "0")).ToList()

标签: c# asp.net linq datatable


【解决方案1】:

以下代码有效:

var test = dtActions.AsEnumerable().Where(z =>
    (string.IsNullOrEmpty(txtFirstName.Text) ? true : z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) &&
    (string.IsNullOrEmpty(txtDisplayName.Text) ? true : z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) &&
    (string.IsNullOrEmpty(txtCreatedBy.Text) ? true : z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper()))
);

您的第二个查询

var results = from dataRow in dtActions.AsEnumerable()
        where (string.IsNullOrEmpty(txtFirstName.Text) ? true : dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) ||
            (string.IsNullOrEmpty(txtDisplayName.Text) ? true : dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) ||
            (string.IsNullOrEmpty(txtCreatedBy.Text) ? true : dataRow.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper())) ||
            (dataRow.Field<DateTime>("CreatedDate") >= Convert.ToDateTime(txtFromDate.Text) && (dataRow.Field<DateTime>("CreatedDate") <= Convert.ToDateTime(txtToDate.Text)))
        select dataRow;

您的代码不起作用的原因是条件运算符不正确。如果字符串为 null 或空,则返回 true,否则检查字段值。

如果您想要一个列表,请应用ToList(),如果您想要一个数组,请应用ToArray()

【讨论】:

  • 如何再次转换回数据表
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2012-06-23
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多