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

时间:2010-08-11 14:48:20

标签: c# dataset lambda

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

的行中的行

我在想像

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

但当然这不起作用!

5 个答案:

答案 0 :(得分:26)

您可以使用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来简化对字段的类型安全访问(以及提供将DBNull转换为null对应项的额外好处在.NET中):

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

答案 1 :(得分:6)

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

对于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
}

答案 2 :(得分:3)

你可以试试这个:

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

答案 3 :(得分:2)

为什么要使用lambda而不是select

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

答案 4 :(得分:0)

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