如何使用C#过滤具有多个列值的数据表

时间:2014-06-12 12:39:10

标签: c# asp.net linq datatable

我的网页上有5个控件,如txtFirstName(TextBox),txtDisplayName(TextBox),txtFromDate(TextBox),txtToDate(TextBox)和{ {1}}(按钮)。另外,我使用DataTable绑定GridView同一页面上的一些数据。

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

过滤条件是,

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

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

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

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

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

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

第一种方式:

btnFilter

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

第二种方式:

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());

2 个答案:

答案 0 :(得分:2)

以下代码有效:

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;

您的代码无法正常工作的原因是条件运算符不正确。如果string为null或为空,则返回true,否则我们检查字段值。

如果您希望列表结束,请应用ToList();如果您希望将其作为数组,则应用ToArray()

答案 1 :(得分:1)