如何在数据表中搜索Col1 =“MyValue”
的行中的行我在想像
Assert.IsTrue(dataSet.Tables[0].Rows.
FindAll(x => x.Col1 == "MyValue" ).Count == 1);
但当然这不起作用!
答案 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)
您编写的代码会检查只有一行符合您的搜索条件。
如果您确实想要这些行,请删除Assert
和Count