2012-10-22 8 views
48

Uso un DataTable con informazioni sugli utenti e voglio cercare un utente o un elenco di utenti in questo DataTable. Ho provato butit non lavoro :(Come posso filtrare un Datatable?

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; 
     } 
+0

il codice funziona o si verifica un errore? – Karthik

+0

Puoi approfondire cosa esattamente non funziona? Ricevi un'eccezione o ottieni 0 risultati (2 cose diverse)? – James

risposta

73

Se si sta utilizzando almeno NET 3.5, vorrei suggerire di usare Linq-To-DataTable invece dal momento che è molto più leggibile e potente:

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

Sopra il codice è solo un esempio, in realtà si dispone di many more methods available.

ricordarsi di aggiungere using System.Linq; e per il metodo di estensione AsEnumerable un riferimento al System.Data.DataSetExtensions dll (How).

+2

Nota di cautela: CopyToDataTable() copia i datarows. Questa non è un'operazione di clonazione, quindi alcune delle proprietà della tabella originale non vengono copiate tra ad es. nome tabella –

+1

@Tim: Che dire del punto di vista delle prestazioni di questo codice? È meglio memorizzare in alcuni elenchi di oggetti e quindi applicare linq/lambda? –

+2

@RajeshMishra: se hai già un 'DataTable 'pieno, mantienilo. Altrimenti preferirei un 'Elenco ' perché non hai boxe/unboxing. Un 'DataTable' usa' System.Object' per tutto, quindi devi sempre trasmettere. Avere una classe personalizzata con proprietà significative ha anche molti altri vantaggi oltre alla leggibilità. –

9

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(); 
+1

Puoi spiegare un po 'più in dettaglio perché questa è una risposta alla domanda? –

5

Per chi lavora in VB.NET (solo nel caso)

Dim dv As DataView = yourDatatable.DefaultView 

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

Hi possiamo usare ToLower metodo a volte non è il filtro.

EmployeeId = Session["EmployeeID"].ToString(); 
var rows = dtCrewList.AsEnumerable().Where 
    (row => row.Field<string>("EmployeeId").ToLower()== EmployeeId.ToLower()); 

    if (rows.Any()) 
    { 
     tblFiltered = rows.CopyToDataTable<DataRow>(); 
    }