【问题标题】:How I can filter a Datatable?如何过滤数据表?
【发布时间】:2018-04-17 10:38:15
【问题描述】:

我使用包含用户信息的 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; 
        }

【问题讨论】:

  • 代码工作正常还是有任何错误?
  • 你能详细说明什么是行不通的吗?你得到一个例外还是你得到 0 个结果(2 个不同的东西)?

标签: c# asp.net filter datatable dataset


【解决方案1】:

这个任务最好使用 DataView。

您可以在这篇文章中找到使用它的示例:How to filter data in dataview

【讨论】:

    【解决方案2】:

    如果您至少使用 .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();
    

    上面的代码只是一个例子,实际上你有many more methods available

    记得添加using System.Linq;,并为AsEnumerable 扩展方法添加对System.Data.DataSetExtensions dll (How) 的引用。

    【讨论】:

    • 注意事项 - CopyToDataTable() 复制数据行。这不是克隆操作,因此原始表中的某些属性不会被复制,例如表名
    • @Tim:从性能上看这段代码怎么样?存储在某个对象列表中然后应用 linq/lambda 会更好吗?
    • @RajeshMishra:如果您已经有一个已填满的DataTable,请保留它。否则我更喜欢List&lt;CustomClass&gt;,因为你没有装箱/拆箱。 DataTable 对所有内容都使用 System.Object,因此您始终必须进行投射。除了可读性之外,拥有具有有意义属性的自定义类还有更多优势。
    • 请注意,您可能会收到错误The source contains no DataRows,可以这样避免:stackoverflow.com/questions/28324740/…
    【解决方案3】:

    您可以使用 DataView。

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


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

    【讨论】:

    • 正是我需要的!感谢您的示例链接!
    【解决方案4】:

    使用它:

    .CopyToDataTable()
    

    示例:

    string _sqlWhere = "Nachname = 'test'";
    string _sqlOrder = "Nachname DESC";
    
    DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable();
    

    【讨论】:

    • 您能否更详细地解释一下为什么这是对所提问题的回答?
    【解决方案5】:

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

    Dim dv As DataView = yourDatatable.DefaultView
    
    dv.RowFilter ="query" ' ex: "parentid = 0"
    

    【讨论】:

      【解决方案6】:

      嗨,我们可以使用 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>();
         }
      

      【讨论】:

        【解决方案7】:

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

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

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

        希望有人会发现这很有用

        【讨论】:

        • 如果选择查询没有返回结果,这将失败。
        猜你喜欢
        • 1970-01-01
        • 2021-09-02
        • 2017-11-14
        • 1970-01-01
        相关资源
        最近更新 更多