Frage LINQ-Abfrage für eine DataTable


Ich versuche, eine LINQ-Abfrage für ein DataTable-Objekt durchzuführen, und seltsamerweise stelle ich fest, dass das Ausführen solcher Abfragen in DataTables nicht einfach ist. Beispielsweise:

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

Das ist nicht erlaubt. Wie bekomme ich so etwas?

Ich bin erstaunt, dass LINQ-Abfragen auf DataTables nicht erlaubt sind!


883
2017-08-14 10:08


Ursprung


Antworten:


Sie können nicht gegen die abfragen DataTableist es Reihen Sammlung, seit DataRowCollection implementiert nicht IEnumerable<T>. Sie müssen das verwenden AsEnumerable() Erweiterung für DataTable. Wie so:

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

Und wie Keith sagt, müssen Sie eine Referenz hinzufügen System.Data.DataSetExtensions

AsEnumerable() kehrt zurück IEnumerable<DataRow>. Wenn Sie konvertieren müssen IEnumerable<DataRow> zu einem DataTable, benutze die CopyToDataTable() Erweiterung.


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



Es ist nicht so, dass sie in DataTables absichtlich nicht erlaubt waren, es ist nur so, dass DataTables die IQueryable- und generischen IEnumerable-Konstrukte vordatieren, auf denen Linq-Abfragen ausgeführt werden können.

Beide Schnittstellen erfordern eine Art-Typ-Sicherheitsvalidierung. DataTables sind nicht stark typisiert. Dies ist der gleiche Grund, warum Menschen beispielsweise keine Anfrage an eine ArrayList stellen können.

Damit Linq funktioniert, müssen Sie Ihre Ergebnisse gegen typsichere Objekte abbilden und stattdessen dagegen abfragen.


57
2017-08-14 10:10



As @ ch00k sagte:

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

Sie müssen außerdem eine Projektreferenz hinzufügen 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



Verwenden von LINQ zum Bearbeiten von Daten in 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



Ich weiß, dass das schon ein paar Mal beantwortet wurde, aber um einen anderen Ansatz zu bieten, benutze ich gerne den .Cast<T>() Methode, es hilft mir, geistig gesund zu bleiben, wenn ich den expliziten Typ definiere, und tief unten denke ich .AsEnumerable() nennt es jedenfalls:

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

oder

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

19
2018-02-02 21:22



Sie können LINQ wie folgt für Objekte in der Rows-Auflistung verwenden:

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

13
2017-08-14 10:11



Probieren Sie diese einfache Abfrage aus:

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

13
2018-04-05 09:38



Versuche dies

var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ; 

9
2018-05-18 07:15