如何过滤数据表?


74

我将数据表与有关用户的信息一起使用,并且我想在此数据表中搜索一个用户或用户列表。我尝试了但是它不起作用:(

这是我的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

您能详细说明什么是行不通的吗?您得到异常还是得到0个结果(2种不同的结果)?
詹姆斯

Answers:



103

如果您至少使用.NET 3.5,我建议改用.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();

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

记住要添加dll的引用,using System.Linq;并作为AsEnumerable扩展方法System.Data.DataSetExtensionsHow)。


4
注意事项-CopyToDataTable()复制数据行。这不是克隆操作,因此原始表中的某些属性不会在整个表中复制,例如表名
Malcolm Swaine

1
@Tim:这段代码的性能如何?存储在某个对象列表中然后应用linq / lambda更好吗?
Rajesh Mishra'4

2
@RajeshMishra:如果您已经吃饱了,DataTable请保留它。否则我会更喜欢一个,List<CustomClass>因为您没有装箱/拆箱。一DataTable用途System.Object的一切,所以你总是要投。具有可读属性的自定义类还具有更多优点,除了可读性强。
蒂姆·施密特

13

明确:

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

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

采用:

.CopyToDataTable()

例:

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

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

2
您能否更详细地说明为什么这是对所提问题的答案?
Adrian Wragg 2014年

list = new DataTable(); =>创建一个空表。list.ImportRow(row); =>您在行中拥有许多列,但表列为空。CopyToDataTable()=>不需要在空表中手动创建列。
VolkanCetinkaya

9

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

Dim dv As DataView = yourDatatable.DefaultView

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

7

有时您实际上想返回a而DataTable不是a DataView。因此,DataView在我的情况下,a不好,而且我猜很少有人会想要这样做。这是我以前做的

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

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

希望有人会发现有用


如果选择查询未返回任何结果,则此操作将失败。
Rayanth


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>();
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.