Pertanyaan LINQ query pada DataTable


Saya mencoba melakukan kueri LINQ pada objek DataTable dan dengan aneh saya menemukan bahwa melakukan kueri seperti pada DataTable tidak langsung. Sebagai contoh:

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

Ini tidak diizinkan. Bagaimana cara mendapatkan sesuatu seperti ini berfungsi?

Saya kagum bahwa pertanyaan LINQ tidak diizinkan pada DataTable!


883
2017-08-14 10:08


asal


Jawaban:


Anda tidak dapat mengajukan kueri terhadap DataTable's Baris koleksi, sejak DataRowCollection tidak mengimplementasikan IEnumerable<T>. Anda perlu menggunakan AsEnumerable() ekstensi untuk DataTable. Seperti ini:

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

Dan seperti kata Keith, Anda harus menambahkan referensi System.Data.DataSetExtensions

AsEnumerable() kembali IEnumerable<DataRow>. Jika Anda perlu mengkonversi IEnumerable<DataRow> ke a DataTable, menggunakan CopyToDataTable() perpanjangan.


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



Ini bukan karena mereka sengaja tidak diizinkan pada DataTable, hanya saja DataTables memprioritaskan IQueryable dan konstruksi IEnumerable generik yang dapat digunakan untuk kueri Linq.

Kedua antarmuka memerlukan semacam validasi keamanan jenis. DataTable tidak diketik dengan kuat. Ini adalah alasan yang sama mengapa orang tidak dapat melakukan query terhadap ArrayList, misalnya.

Agar Linq berfungsi, Anda perlu memetakan hasil Anda terhadap objek yang aman-jenis dan kueri terhadapnya.


57
2017-08-14 10:10



Seperti yang dikatakan @ ch00k:

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

Anda juga perlu menambahkan referensi proyek 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



Menggunakan LINQ untuk memanipulasi data di 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



Saya menyadari ini telah dijawab beberapa kali, tetapi hanya untuk menawarkan pendekatan lain, saya suka menggunakan .Cast<T>() metode, itu membantu saya menjaga kewarasan dalam melihat jenis eksplisit didefinisikan, dan saya pikir .AsEnumerable() menyebutnya anyways:

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

atau

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

19
2018-02-02 21:22



Anda dapat menggunakan LINQ ke objek pada koleksi Rows, seperti:

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

13
2017-08-14 10:11