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

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


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

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"

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


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


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>();
   }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.