2012-10-22 167 views
48

我使用DataTable和關於用戶的信息,我想在這個DataTable中搜索用戶或用戶列表。我嘗試butit不工作:(如何過濾數據表?

這裏是我的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

是代碼工作還是你得到任何錯誤? – Karthik

+0

你能詳細說明究竟哪些方法無效嗎?你得到一個異常,或者你得到0結果(2種不同的東西)? – James

回答

73

如果您正在使用至少.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)。

+2

注意事項 - CopyToDataTable()複製數據行。這不是克隆操作,因此原始表格中的一些屬性不會通過例如表名 –

+1

@Tim:這個代碼的性能觀點呢?存儲一些對象列表然後應用linq/lambda是否更好? –

+2

@RajeshMishra:如果你已經有一個填充好的'DataTable'保存它。否則,我更喜歡'List '因爲你沒有裝箱/取消裝箱。 DataTable使用'System.Object'來處理所有事情,所以你總是需要投射。除了可讀性之外,擁有具有有意義屬性的自定義類還有更多優點。 –

9

明確:

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

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

使用:

​​

例如:

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

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

你能詳細解釋一下爲什麼這是對問題的回答嗎? –

5

對於誰在VB.NET(以防萬一)工作的人

Dim dv As DataView = yourDatatable.DefaultView 

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

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