如何使用lambda表达式过滤DataRows?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用lambda表达式过滤DataRows?相关的知识,希望对你有一定的参考价值。

如何在数据表中搜索Col1 =“MyValue”的行中的行

我在想类似的东西

Assert.IsTrue(dataSet.Tables[0].Rows.
    FindAll(x => x.Col1 == "MyValue" ).Count == 1);

但当然这不起作用!

答案

您可以使用LINQ to DataSets执行此操作:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1);

注意,您也可以在不调用Assert的情况下执行此操作:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single();

如果行数不等于1(因此,调用Single),则会抛出异常,并且未处理的异常将使测试用例失败。就个人而言,我喜欢后者,因为它具有更清晰的语义。

以上可以进一步削减到:

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue");

此外,您可以利用Field method上的DataRowExtensions class来简化对字段的类型安全访问(以及提供将.NET中的DBNull转换为null对应项的额外好处):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue");
另一答案

您可以使用数据表的Select方法执行此操作,或使用表中DefaultDataView的Filter属性。

对于Select方法:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");

对于DefaultView过滤器:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
    // Do your processing
}
另一答案

你可以试试这个:

var b=datatable.AsEnumerable.where(p=> p.Field<string>   
("column_name")=="desire_value").CopyToDataTable()
另一答案

为什么要使用lambda而不是select

  DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
另一答案

您编写的代码检查只有一行符合您的搜索条件。如果你真的想要行,请删除AssertCount

以上是关于如何使用lambda表达式过滤DataRows?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda表达式where过滤数据

lambda表达式使用stream过滤集合浅尝

如何使用 lambda 表达式调试 stream().map(...)?

使用 lambda 表达式在 Entity Framework 的实体上动态应用过滤器

使用动态唯一键值对linq / lambda表达式列表过滤数据

构建动态表达式树以过滤集合属性