2012-10-22 15 views
48

Używam DataTable z informacjami o użytkownikach i chcę wyszukać użytkownika lub listę użytkowników w tym DataTable. Staram się go butit nie działa :(Jak mogę filtrować datatable?

Oto mój kod 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

czy kod działa lub czy pojawia się błąd? – Karthik

+0

Czy możesz opracować, co dokładnie nie działa? Czy otrzymujesz wyjątek, czy otrzymujesz 0 wyników (2 różne rzeczy)? – James

Odpowiedz

73

Jeśli używasz przynajmniej .NET 3.5, proponuję użyć Linq-To-DataTable zamiast ponieważ jest znacznie bardziej czytelny i mocny:

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

Powyższy kod jest tylko przykładem, w rzeczywistości masz many more methods available.

Pamiętaj, aby dodać using System.Linq; i dla metody przedłużania AsEnumerable odniesienie do dll System.Data.DataSetExtensions (How).

+2

Uwaga - CopyToDataTable() kopiuje pliki danych. Nie jest to operacja klonowania, więc niektóre właściwości z oryginalnej tabeli nie są kopiowane między np. nazwa tabeli –

+1

@Tim: A co z punktem widzenia wydajności tego kodu? Czy lepiej jest przechowywać na jakiejś liście obiektów, a następnie zastosować linq/lambda? –

+2

@RajeshMishra: jeśli masz już wypełnione 'DataTable' zachowaj. W przeciwnym razie wolałbym 'List ' ponieważ nie masz boksu/rozpakowywania. "DataTable" używa "System.Object" do wszystkiego, więc zawsze musisz rzutować. Posiadanie niestandardowej klasy o znaczących właściwościach ma także wiele innych zalet oprócz czytelności. –

9

jasne:

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

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

zastosowanie:

.CopyToDataTable() 

przykład:

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

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

Czy możesz wyjaśnić nieco bardziej szczegółowo, dlaczego jest to odpowiedź na zadane pytanie? –

5

Dla każdego, kto pracuje w VB.NET (na wszelki wypadek)

Dim dv As DataView = yourDatatable.DefaultView 

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

Hi możemy użyć metody Metoda ToLower czasami nie jest filtrowane.

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

    if (rows.Any()) 
    { 
     tblFiltered = rows.CopyToDataTable<DataRow>(); 
    } 
Powiązane problemy