如何根据列值筛选我的DataTable?

13

我有一个关于DataTable的问题。我从数据库检索到一个DataTable,其中一列包含1或0。现在我想只检索具有该列中值为1的行。

该列的名称为ACTIVATE

这是我的DataTable

DataTable table = new DataTable(TABLE);

//How can I filter here so ACTIVATE == 1?

adapter.Fill(table);

connection.Open();

selectcommand.ExecuteReader();

return table;

2
你难道不是使用查询来填充数据表吗?在该查询中使用 where 条件。 - Samy S.Rathore
在查询中执行逻辑,将null传递以返回所有带有参数WHERE (@filter is NULL OR ACTIVATE = @filter)。 - CR41G14
4个回答

28

通过 SQL(优选)

SELECT * FROM dbo.Table WHERE ACTIVATE = 1

通过Linq-To-Datatable(内存中):

DataTable tblFiltered = table.AsEnumerable()
                             .Where(r => r.Field<int>("ACTIVATE") == 1)
                             .CopyToDataTable();

如果您仍在使用.NET 2,您可以使用DataTable.Select

DataRow[] filteredRows = table.Select("ACTIVATE = 1");

除此之外,您不需要使用 selectcommand.ExecuteReader() 来填充表格。

DataTable table = new Datatable();
using(var con = new SqlConnection(connectionString))
using(var cmd = new SqlCommand("SELECT * FROM dbo.Table WHERE ACTIVATE = 1", con))
using(var da = new SqlDataAdapter(cmd))
{
    da.Fill( table );
}

添加一个Datatable.Select()过滤器,这个答案就完整了。 :) - Samy S.Rathore
@SamyS.Rathore:为什么?Linq更加强大,而且支持强类型的Field方法,也支持可空类型,这是更好的选择(如果可用)。编辑:不过,你是对的。已相应地编辑了我的答案。 - Tim Schmelter
1
当然是的,我只是这样说是为了在一个答案中涵盖所有选项。 - Samy S.Rathore
Datatable.Select非常慢,特别是在处理大量记录时。 - Antonio Bakula
@AntonioBakula 不知道这个...谢谢,我今天学到了新的东西..!! 这个答案必须被接受。 - Samy S.Rathore
CopyToDataTable() 挽救了我。 - Niklas

4
您可以直接按照以下方式使用DataTable.Select函数:
 foundRows = table.Select("ACTIVATE = '1'");

它返回一个 DataRow 对象的数组。

4
DataTable results = table.Select("ACTIVATE = 1").CopyToDataTable();

这应该能实现您想要的,基本上您可以像SQL一样查询数据表。


2
return table;
DataTable results = table.Select("ACTIVATE = 1").CopyToDataTable();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接