Question Requête LINQ sur un DataTable


J'essaie d'effectuer une requête LINQ sur un objet DataTable et bizarrement, je trouve que l'exécution de telles requêtes sur DataTables n'est pas simple. Par exemple:

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

Ceci n'est pas autorisé. Comment puis-je faire fonctionner quelque chose comme ça?

Je suis étonné que les requêtes LINQ ne soient pas autorisées sur DataTables!


883
2017-08-14 10:08


origine


Réponses:


Vous ne pouvez pas interroger le DataTablede Lignes collection, depuis DataRowCollection ne met pas en œuvre IEnumerable<T>. Vous devez utiliser le AsEnumerable() extension pour DataTable. Ainsi:

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

Et comme le dit Keith, vous devrez ajouter une référence à System.Data.DataSetExtensions

AsEnumerable() résultats IEnumerable<DataRow>. Si vous avez besoin de convertir IEnumerable<DataRow> à un DataTable, Utilisez le CopyToDataTable() extension.


1120
2017-08-14 19:45



var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow

111
2018-03-05 02:53



Ce n'est pas qu'ils ont délibérément été interdits sur DataTables, c'est juste que DataTables est antérieur aux constructions IQueryable et IEnumerable génériques sur lesquelles les requêtes Linq peuvent être effectuées.

Les deux interfaces nécessitent une validation de type type-sécurité. Les DataTables ne sont pas fortement typés. C'est la même raison pour laquelle les personnes ne peuvent pas interroger une ArrayList, par exemple.

Pour que Linq fonctionne, vous devez mapper vos résultats sur des objets sécurisés et lancer une requête à la place.


57
2017-08-14 10:10



Comme @ ch00k a dit:

using System.Data; //needed for the extension methods to work

...

var results = 
    from myRow in myDataTable.Rows 
    where myRow.Field<int>("RowNo") == 1 
    select myRow; //select the thing you want, not the collection

Vous devez également ajouter une référence de projet à System.Data.DataSetExtensions


45
2017-08-14 11:07



var query = from p in dt.AsEnumerable()
                    where p.Field<string>("code") == this.txtCat.Text
                    select new
                    {
                        name = p.Field<string>("name"),
                        age= p.Field<int>("age")                         
                    };

33
2018-05-23 04:03



Utilisation de LINQ pour manipuler des données dans DataSet / DataTable

var results = from myRow in tblCurrentStock.AsEnumerable()
              where myRow.Field<string>("item_name").ToUpper().StartsWith(tbSearchItem.Text.ToUpper())
              select myRow;
DataView view = results.AsDataView();

24
2017-07-13 11:21



//Create DataTable 
DataTable dt= new DataTable();
dt.Columns.AddRange(New DataColumn[]
{
   new DataColumn("ID",typeOf(System.Int32)),
   new DataColumn("Name",typeOf(System.String))

});

//Fill with data

dt.Rows.Add(new Object[]{1,"Test1"});
dt.Rows.Add(new Object[]{2,"Test2"});

//Now  Query DataTable with linq
//To work with linq it should required our source implement IEnumerable interface.
//But DataTable not Implement IEnumerable interface
//So we call DataTable Extension method  i.e AsEnumerable() this will return EnumerableRowCollection<DataRow>


// Now Query DataTable to find Row whoes ID=1

DataRow drow = dt.AsEnumerable().Where(p=>p.Field<Int32>(0)==1).FirstOrDefault();
 // 

24
2018-01-05 08:43



Je me rends compte que cela a été répondu à quelques reprises, mais juste pour offrir une autre approche, j'aime utiliser le .Cast<T>() méthode, il m'aide à maintenir la santé mentale en voyant le type explicite défini, et au fond je pense .AsEnumerable() appelle de toute façon:

var results = from myRow in myDataTable.Rows.Cast<DataRow>()
                  where myRow.Field<int>("RowNo") == 1 select myRow;

ou

var results = myDataTable.Rows.Cast<DataRow>()
                  .FirstOrDefault(x => x.Field<int>("RowNo") == 1);

19
2018-02-02 21:22



Vous pouvez utiliser LINQ pour les objets de la collection Rows, comme ceci:

var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;

13
2017-08-14 10:11



Essayez cette simple ligne de requête:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);

13
2018-04-05 09:38