如何使用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'");
另一答案
您编写的代码检查只有一行符合您的搜索条件。如果你真的想要行,请删除Assert
和Count
以上是关于如何使用lambda表达式过滤DataRows?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 lambda 表达式调试 stream().map(...)?
使用 lambda 表达式在 Entity Framework 的实体上动态应用过滤器