83

我使用带有用户信息的 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; 
        }
4

7 回答 7

127

您可以使用数据视图。

DataView dv = new DataView(yourDatatable);
dv.RowFilter = "query"; // query example = "id = 10"


http://www.csharp-examples.net/dataview-rowfilter/

于 2012-10-22T13:39:34.073 回答
117

如果您至少使用 .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;为扩展方法添加对dllAsEnumerable的引用( How)。System.Data.DataSetExtensions

于 2012-10-22T13:38:58.867 回答
15

用它:

.CopyToDataTable()

例子:

string _sqlWhere = "Nachname = 'test'";
string _sqlOrder = "Nachname DESC";

DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable();
于 2014-03-13T10:53:57.813 回答
10

有时您实际上想要返回 aDataTable而非 a DataView。所以DataView在我的情况下 a 并不好,我想很少有人会想要它。这是我以前做的

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

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

希望有人会发现这很有用

于 2018-05-03T23:30:06.810 回答
9

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

Dim dv As DataView = yourDatatable.DefaultView

dv.RowFilter ="query" ' ex: "parentid = 0"
于 2015-03-21T03:37:49.943 回答
5

最好使用 DataView 来完成此任务。

您可以在这篇文章中找到使用它的示例:如何在数据视图中过滤数据

于 2012-10-22T13:38:32.620 回答
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>();
   }
于 2018-01-30T12:01:41.260 回答