web-dev-qa-db-fra.com

Comment puis-je filtrer un Datatable?

J'utilise un DataTable avec des informations sur les utilisateurs et je souhaite rechercher un utilisateur ou une liste d'utilisateurs dans ce DataTable. Je l'essaie mais ça ne marche pas :( 

Voici mon code 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; 
        }
60
Tarasov

Vous pouvez utiliser DataView.

DataView dv = new DataView(yourDatatable);
dv.RowFilter = "query"; // query example = "id = 10"


http://www.csharp-examples.net/dataview-rowfilter/

96
Kadir

Si vous utilisez au moins .NET 3.5, je vous conseillerais plutôt d'utiliser Linq-To-DataTable, car il est beaucoup plus lisible et puissant:

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

Le code ci-dessus n’est qu’un exemple. En fait, vous avez beaucoup plus de méthodes disponibles

Pensez à ajouter using System.Linq; et à la méthode d'extension AsEnumerable une référence à la dll System.Data.DataSetExtensions ( How ).

83
Rango

clair:

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

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

utilisation:

.CopyToDataTable()

exemple:

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

DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable();
11
VolkanCetinkaya

Pour tous ceux qui travaillent dans VB.NET (juste au cas où)

Dim dv As DataView = yourDatatable.DefaultView

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

Il est préférable d'utiliser DataView pour cette tâche.

Vous pouvez trouver dans cet article un exemple d'utilisation: Comment filtrer des données dans Dataview

4
Maxim Kornilov

Parfois, vous souhaitez réellement renvoyer un DataTable à un DataView. Donc, un DataView n’était pas bon dans mon cas et je suppose que peu d’autres le voudraient aussi. Voici ce que je faisais

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

Cela va filtrer myDataTable qui est un DataTable et retourner un nouveau DataTable

J'espère que quelqu'un trouvera cela utile

1
Dilaksha A

Salut, nous pouvons utiliser la méthode ToLower parfois, il ne s'agit pas de filtre.

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

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