Come posso filtrare un Datatable?

Uso un DataTable con informazioni sugli utenti e voglio cercare un utente o un elenco di utenti in questo DataTable. Lo provo ma non funziona 🙁

Ecco il mio codice 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; } 

È ansible utilizzare DataView.

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

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

Se si utilizza almeno .NET 3.5, suggerirei di utilizzare Linq-To-DataTable poiché è molto più leggibile e potente:

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

Sopra il codice è solo un esempio, in realtà hai molti più metodi disponibili .

Ricordarsi di aggiungere using System.Linq; e per il metodo di estensione AsEnumerable un riferimento alla DLL di System.Data.DataSetExtensions ( Come ).

chiaro:

 list = null; // for testing list = new DataTable(); // for testing foreach (DataRow row in rows) { list.ImportRow(row); } 

uso:

 .CopyToDataTable() 

esempio:

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

Per chiunque lavori in VB.NET (per ogni evenienza)

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

È meglio utilizzare DataView per questa attività.

Esempio di utilizzo che puoi trovare in questo post: Come filtrare i dati in DataView

A volte si desidera effettivamente restituire un DataTable piuttosto che un DataView. Quindi un DataView non era buono nel mio caso e immagino che pochi altri vorrebbero anche questo. Ecco cosa facevo

myDataTable.select ( “MyQuery”). CopyToDataTable ()

Questo filtrerà myDataTable che è un DataTable e restituirà un nuovo DataTable

Spero che qualcuno troverà che è utile

Ciao, possiamo usare il metodo ToLower a volte non è un filtro.

 EmployeeId = Session["EmployeeID"].ToString(); var rows = dtCrewList.AsEnumerable().Where (row => row.Field("EmployeeId").ToLower()== EmployeeId.ToLower()); if (rows.Any()) { tblFiltered = rows.CopyToDataTable(); }