如何在不强制执行的情况下过滤DataTable?

时间:2017-01-24 19:08:40

标签: c# linq datatable

我使用存储过程填充DataTable。但是,在一个特定的实例中,我需要根据结果集中不是存储过程提供的参数之一的成员值的值,将这些结果过滤到它们通常的子集。

ISTM应该可以过滤DataTable,为这个单一的场景分配自己的一个子集。

我不知道我需要什么样的代码,但我认为伪代码会是这样的(" dtUsage"是一个DataTable):

dtUsage = dtUsage.Rows Where MemberNo in ["0451", "050", "067"];

我可以临时使用另一个DataTable,并循环遍历第一个,有条件地将行添加到第二个,但我确信有更优雅的方法来使用LINQ左右。

更新

基于我所看到的here,这样的事情可能有用:

DataRow[] result = dtUsage.Select("MemberNo IN [\"103\",\"016\",\"04501\"]");

...但是如何将结果分配给数据表?

这两个都没有:

dtUsage = result;

......也不是这样:

dtUsage.Rows = result;

...编译。这也不是:

DataTable dt = new DataTable();
foreach (DataRow drp in result)
{
    dt.Add(drp);
}

2 个答案:

答案 0 :(得分:1)

我猜你可以使用这样的东西。

dtUsage = dtUsage.Where(data => data.MemberNo  == '0451' || data.MemberNo   == '050' || data.MemberNo   == '067')

编辑:或许这个?

var results = from row in dtUsage.AsEnumerable()
where (row.Field<string>("MemberNo") == "0451" ||
row.Field<string>("MemberNo") == "050" ||
row.Field<string>("MemberNo") == "067")
select row;

答案 1 :(得分:1)

您可能需要以下内容:

var result = from x in dtUsage.AsEnumerable()
where new string[]{"0451", "050", "067"}.Contains(x.Field<string>("MemberNo"))
select x;