Wie kann ich eine Datentabelle filtern?

73

Ich verwende eine DataTable mit Informationen zu Benutzern und möchte einen Benutzer oder eine Liste von Benutzern in dieser DataTable suchen. Ich versuche es, aber es funktioniert nicht :(

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; 
        }
Tarasov
quelle
Funktioniert der Code oder erhalten Sie einen Fehler?
Karthik
Können Sie näher erläutern, was genau nicht funktioniert? Erhalten Sie eine Ausnahme oder erhalten Sie 0 Ergebnisse (2 verschiedene Dinge)?
James

Antworten:

103

Wenn Sie mindestens .NET 3.5 verwenden, würde ich empfehlen, Linq-To-DataTablestattdessen zu verwenden, da es viel lesbarer und leistungsfähiger ist:

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 stehen Ihnen viel mehr Methoden zur Verfügung .

Denken Sie daran, einen Verweis auf die DLL ( How ) using System.Linq;für die AsEnumerableErweiterungsmethode hinzuzufügen .System.Data.DataSetExtensions

Tim Schmelter
quelle
4
Hinweis zur Vorsicht - CopyToDataTable () kopiert die Datenzeilen. Dies ist keine Klonoperation, daher werden einige der Eigenschaften aus der ursprünglichen Tabelle nicht kopiert, z. B. Tabellenname
Malcolm Swaine
1
@ Tim: Was ist mit der Leistungssicht dieses Codes? Ist es besser, in einer Objektliste zu speichern und dann linq / lambda anzuwenden?
Rajesh Mishra
2
@ RajeshMishra: Wenn du bereits eine gefüllte hast, DataTablebehalte sie. Ansonsten würde ich ein bevorzugen, List<CustomClass>weil du kein Boxen / Unboxen hast. A DataTableverwendet System.Objectfür alles, so dass Sie immer werfen müssen. Eine benutzerdefinierte Klasse mit aussagekräftigen Eigenschaften bietet neben der Lesbarkeit noch viele weitere Vorteile.
Tim Schmelter
12

klar:

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

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

verwenden:

.CopyToDataTable()

Beispiel:

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

DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable();
VolkanCetinkaya
quelle
2
Können Sie etwas genauer erklären, warum dies eine Antwort auf die gestellte Frage ist?
Adrian Wragg
list = new DataTable (); => leere Tabelle erstellen. list.ImportRow (Zeile); => Sie haben viele Spalten in der Zeile, aber die Tabellenspalte ist leer. CopyToDataTable () => Sie müssen keine Spalten in einer leeren Tabelle manuell erstellen.
VolkanCetinkaya
8

Für alle, die in VB.NET arbeiten (nur für den Fall)

Dim dv As DataView = yourDatatable.DefaultView

dv.RowFilter ="query" ' ex: "parentid = 0"
nghiavt
quelle
7

Manchmal möchten Sie tatsächlich a DataTableals a zurückgeben DataView. Also DataViewwar a in meinem Fall nicht gut und ich denke, nur wenige andere würden das auch wollen. Hier ist, was ich früher gemacht habe

myDataTable.select("myquery").CopyToDataTable()

Dadurch wird gefiltert, myDataTablewelches eine DataTable ist, und eine neue zurückgegebenDataTable

Hoffe, jemand wird das nützlich finden

Dilaksha A.
quelle
Dies schlägt fehl, wenn die Auswahlabfrage keine Ergebnisse zurückgibt.
Rayanth
4

Es ist besser, DataView für diese Aufgabe zu verwenden.

Ein Beispiel für die Verwendung finden Sie in diesem Beitrag: So filtern Sie Daten in der Datenansicht

Maxim Kornilov
quelle
2

Hallo, wir können die ToLower-Methode verwenden, manchmal ist es kein Filter.

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

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