2012-10-22 42 views
48

Ich benutze eine DataTable mit Informationen über Benutzer und ich möchte einen Benutzer oder eine Liste von Benutzern in dieser DataTable suchen. Ich versuche es butit funktionieren nicht :(Wie kann ich eine Datentabelle filtern?

Hier ist mein C# -Code.

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

funktioniert der Code oder erhalten Sie einen Fehler? – Karthik

+0

Können Sie näher erläutern, was genau nicht funktioniert? Erhalten Sie eine Ausnahme oder erhalten Sie 0 Ergebnisse (2 verschiedene Dinge)? – James

Antwort

4

Es ist besser für Dataview diese Aufgabe zu verwenden

Beispiel für die es verwenden, können Sie finden in dieser Beitrag: How to filter data in dataview

73

Wenn Sie mindestens .NET 3.5 verwenden würde ich vorschlagen, Linq-To-DataTable stattdessen zu verwenden, da es viel besser lesbar und leistungsstark:

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

Der obige Code ist nur ein Beispiel, tatsächlich haben Sie many more methods available.

bleiben using System.Linq; und für die AsEnumerable Erweiterungsmethode ein Verweis auf die System.Data.DataSetExtensions dll (How) hinzuzufügen.

+2

Vorsichtshinweis - CopyToDataTable() kopiert die Datenzeilen. Dies ist keine Klonoperation, daher werden einige der Eigenschaften aus der Originaltabelle nicht z. Tabellenname –

+1

@Tim: Was ist mit der Leistung Sicht dieses Codes? Ist es besser, in einer Objektliste zu speichern und dann linq/lambda anzuwenden? –

+2

@RajeshMishra: Wenn Sie bereits ein gefülltes 'DataTable' haben, behalten Sie es. Sonst würde ich eine 'Liste ' bevorzugen, weil Sie kein Boxen/Unboxing haben. Eine 'DataTable' verwendet' System.Object' für alles, sodass Sie immer casten müssen. Eine benutzerdefinierte Klasse mit aussagekräftigen Eigenschaften hat neben der Lesbarkeit noch viele weitere Vorteile. –

9

klar:

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

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

Verwendung:

.CopyToDataTable() 

Beispiel:

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

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

Können Sie etwas genauer erklären, warum dies eine Antwort auf die gestellte Frage ist? –

5

Für alle, die in VB.NET (für alle Fälle) arbeiten

Dim dv As DataView = yourDatatable.DefaultView 

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

Hallo können wir ToLower Methode verwenden, ist es manchmal nicht filtern.

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

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