【问题标题】:Filter DATATABLE Rows with multiple Values in columns过滤列中具有多个值的 DATATABLE 行
【发布时间】:2021-01-21 05:38:10
【问题描述】:

我有一个包含多个列的 DataTable (dt),它是 DataGridView 的源。我正在尝试使用特定列的 值列表 过滤此 DataTable(dt)。

我需要使用员工姓名列表过滤Below DataTable(dt)。 EmpList = {'Pete','Alen'}

这是我的数据表

Employee ID Country
Pete 1 USA
Mark 2 UK
Alen 3 AUS

需要输出:

Employee ID Country
Pete 1 USA
Alen 3 AUS

我正在用下面的代码试试

if (EmpList.Any())
{
  foreach(string item in EmpList)
  {
    var dataRows = from dataRow in dt.AsEnumerable()
                   where (dataRow.Field<string>("Employee").Contains(item))
                   select dataRow;

    dt.Rows.Add(dataRows);
  }
}

问题是在这段代码中,DataType(System.Data.EnumerableRowCollection[system.Data.DataRow]) 正在与之前的数据一起填充 DataTable 的行。

【问题讨论】:

  • 您有问题吗?请阅读How to Ask 并发布minimal reproducible example。
  • 我的 linq foo 很弱,但在我看来,您正在 dt 中搜索与 item 匹配的行,然后尝试将这些行添加回 dt。我们这里有XY problem 吗?您是在尝试使用这些元素构建新表,还是过滤现有表?
  • @jwdonahue 我正在尝试过滤现有数据表并分配给datagridview。

标签: c# filter datatable datarow


【解决方案1】:

如果要过滤DataTable,可以使用DefaultView.RowFilter,加入要比较的值的集合,在比较中使用IN()操作符:

var names = new[]{ "Allen", "Pete" };
var values = string.Join("', '", names);
dt.DefaultView.RowFilter = $"Employee IN('{values}')";

请注意,字符串使用逗号和单引号连接:', '
要删除过滤器,只需将其设置为string.Empty。

如果要返回一个新的DataTable,可以使用CopyToDataTable方法:

var dtFiltered = dt.AsEnumerable()
    .Where(dr => names.Any(s => s.Equals(dr["Employees"]))).CopyToDataTable();

您也可以将 DataTable 分配给自身:

dt = dt.AsEnumerable().Where(...).CopyToDataTable();

我假设您已经在引用 System.Data.DataSetExtensions,因为您在代码中使用了 AsEnymerable()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2019-04-23
    • 2012-07-11
    相关资源
    最近更新 更多