如何筛选Datatable?

93

我使用一个包含用户信息的 DataTable 并想在这个 DataTable 中搜索一个或多个用户。我尝试了一下,但它没有起作用 :(

以下是我的 C# 代码:

 public DataTable GetEntriesBySearch(string username,string location,DataTable table)
        {
            list = null;
            list = table;

            string expression;
            string sortOrder;

            expression = "Nachname = 'test'";
            sortOrder = "nachname DESC";

            DataRow[] rows =  list.Select(expression, sortOrder);

            list = null; // for testing
            list = new DataTable(); // for testing

            foreach (DataRow row in rows)
            {
                list.ImportRow(row);
            }

            return list; 
        }

代码是否正常运行或者出现了错误? - Karthik
你能详细说明到底哪里出了问题吗?是出现了异常还是没有得到任何结果(两种不同的情况)? - James
7个回答

147

非常好!感谢提供示例链接,正是我所需要的。 - Richard Varno

140

如果你使用的是至少.NET 3.5,我建议使用 Linq-To-DataTable ,因为它更加易读和强大。

DataTable tblFiltered = table.AsEnumerable()
          .Where(row => row.Field<String>("Nachname") == username
                   &&   row.Field<String>("Ort") == location)
          .OrderByDescending(row => row.Field<String>("Nachname"))
          .CopyToDataTable();

上面的代码只是一个例子,实际上你有更多可用的方法

记得加入 using System.Linq; 并添加对 System.Data.DataSetExtensions dll 的引用以使用 AsEnumerable 扩展方法(如何添加)。


4
注意事项 - CopyToDataTable() 方法会复制数据行。这不是克隆操作,因此一些原始表的属性(例如表名)不会被复制过去。 - Malcolm Swaine
1
@Tim:就代码的性能而言,将其存储在某个对象列表中,然后应用linq/lambda是否更好? - Rajesh Mishra
2
@RajeshMishra:如果您已经有一个填充的DataTable,请保留它。否则,我更喜欢使用List<CustomClass>,因为您没有装箱/拆箱。DataTable对于所有内容都使用System.Object,因此您总是需要进行强制转换。除了可读性之外,具有有意义属性的自定义类还具有许多其他优点。 - Tim Schmelter
1
请注意,您可能会收到“源不包含DataRows”的错误提示,可以通过以下方式避免:https://dev59.com/Nl4c5IYBdhLWcg3wFm84 - SharpC
@SharpC:从性能角度来看,最好使用try...catch并处理InvalidOperationException,而不是使用if(rows.Any())...,因为否则会执行两次查询。 - Tim Schmelter

21
使用它:
.CopyToDataTable()

例子:
string _sqlWhere = "Nachname = 'test'";
string _sqlOrder = "Nachname DESC";

DataTable _newDataTable = yurDataTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable();

3
你能否详细解释一下为什么这是对所提出问题的答案? - Adrian Wragg

13

有时候您实际上需要返回一个 DataTable 而不是一个 DataView。所以在我的情况下, DataView 不好用,我猜其他人也会这样想。这是我过去的做法:

myDataTable.select("myquery").CopyToDataTable()

这将过滤myDataTable,它是一个 DataTable,并返回一个新的DataTable

希望有人会发现这很有用


1
如果选择查询没有返回结果,这将失败。 - Rayanth

11

对于任何从事VB.NET工作的人(以防万一)

Dim dv As DataView = yourDatatable.DefaultView

dv.RowFilter ="query" ' ex: "parentid = 0"

5

2

大家好,有时候我们可以使用ToLower方法,但它并不总是过滤掉所有内容。

EmployeeId = Session["EmployeeID"].ToString();
var rows = dtCrewList.AsEnumerable().Where
   (row => row.Field<string>("EmployeeId").ToLower()== EmployeeId.ToLower());

   if (rows.Any())
   {
        tblFiltered = rows.CopyToDataTable<DataRow>();
   }

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