【发布时间】:2011-03-28 10:32:22
【问题描述】:
如何在数据表中搜索具有 Col1="MyValue" 的行
我在想类似的事情
Assert.IsTrue(dataSet.Tables[0].Rows.
FindAll(x => x.Col1 == "MyValue" ).Count == 1);
但这当然行不通!
【问题讨论】:
-
你想返回匹配的行,还是只计算有多少行?
如何在数据表中搜索具有 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");
此外,您可以利用DataRowExtensions class 上的Field method 来简化对该字段的类型安全访问(以及提供将DBNull 转换为.NET 中的空对应项的额外好处):
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
}
【讨论】:
为什么使用 lambda 而不是 select?
DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
【讨论】:
你可以试试这个:
var b=datatable.AsEnumerable.where(p=> p.Field<string>
("column_name")=="desire_value").CopyToDataTable()
【讨论】:
您编写的代码检查是否只有一行满足您的搜索条件。
如果您确实想要这些行,请删除 Assert 和 Count
【讨论】: