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

标签 c# asp.net linq datatable

我的网页上有 5 个控件,例如 txtFirstName(TextBox)、txtDisplayName(TextBox)、txtFromDate (TextBox)、txtToDate(文本框)和btnFilter(按钮)。另外,我使用 DataTable 在 GridView 同一页面上绑定(bind)一些数据。

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

过滤条件为,

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

  • 我们需要通过 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());

我不知道如何获取日期时间文本框之间的数据。

第二种方式:

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;

最佳答案

以下代码有效:

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

关于c# - 如何使用 C# 过滤具有多列值的数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184638/

相关文章:

c# - 哪个命名空间在 CaSTLe Windsor 中拥有 Component.For?

c# - ToString ("f2"中的 .NET 舍入错误)

javascript - 如何在可视化 Web 开发人员中将 javascript 组合到 html/ASP.Net 中?

.net - LINQBridge用户: is it feature-complete?

c# - 相当于 SQL IN 运算符的 linq 是什么

c# - 通过对象进行转换时不会调用 TryConvert

asp.net - IdentityServer、客户端和用户配置文件管理

asp.net - 在Windows 7笔记本电脑中找不到IIS_IUSRS组

c# - 将字典吹出到列表中

c# - 哪里返回错误记录