【问题标题】:How do I use lambda expressions to filter DataRows?如何使用 lambda 表达式过滤 DataRows?
【发布时间】:2011-03-28 10:32:22
【问题描述】:

如何在数据表中搜索具有 Col1="MyValue" 的行

我在想类似的事情

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

但这当然行不通!

【问题讨论】:

  • 你想返回匹配的行,还是只计算有多少行?

标签: c# dataset lambda


【解决方案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");

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

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

【讨论】:

    【解决方案2】:

    您可以使用数据表的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
    }
    

    【讨论】:

    • 这可能不是提问者想要的,但我发现它很有帮助。
    【解决方案3】:

    为什么使用 lambda 而不是 select

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

    【讨论】:

    • 应该只有 1 个等号
    【解决方案4】:

    你可以试试这个:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-04
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        相关资源
        最近更新 更多