LINQ query on a DataTable

前端 未结 23 1417
执笔经年
执笔经年 2020-11-22 01:59

I\'m trying to perform a LINQ query on a DataTable object and bizarrely I am finding that performing such queries on DataTables is not straightforward. For example:

相关标签:
23条回答
  • 2020-11-22 02:04
    //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();
     // 
    
    0 讨论(0)
  • 2020-11-22 02:04

    Example on how to achieve this provided below:

    DataSet dataSet = new DataSet(); //Create a dataset
    dataSet = _DataEntryDataLayer.ReadResults(); //Call to the dataLayer to return the data
    
    //LINQ query on a DataTable
    var dataList = dataSet.Tables["DataTable"]
                  .AsEnumerable()
                  .Select(i => new
                  {
                     ID = i["ID"],
                     Name = i["Name"]
                   }).ToList();
    
    0 讨论(0)
  • 2020-11-22 02:06

    Most likely, the classes for the DataSet, DataTable and DataRow are already defined in the solution. If that's the case you won't need the DataSetExtensions reference.

    Ex. DataSet class name-> CustomSet, DataRow class name-> CustomTableRow (with defined columns: RowNo, ...)

    var result = from myRow in myDataTable.Rows.OfType<CustomSet.CustomTableRow>()
                 where myRow.RowNo == 1
                 select myRow;
    

    Or (as I prefer)

    var result = myDataTable.Rows.OfType<CustomSet.CustomTableRow>().Where(myRow => myRow.RowNo);
    
    0 讨论(0)
  • 2020-11-22 02:07

    You can't query against the DataTable's Rows collection, since DataRowCollection doesn't implement IEnumerable<T>. You need to use the AsEnumerable() extension for DataTable. Like so:

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

    And as @Keith says, you'll need to add a reference to System.Data.DataSetExtensions

    AsEnumerable() returns IEnumerable<DataRow>. If you need to convert IEnumerable<DataRow> to a DataTable, use the CopyToDataTable() extension.

    Below is query with Lambda Expression,

    var result = myDataTable
        .AsEnumerable()
        .Where(myRow => myRow.Field<int>("RowNo") == 1);
    
    0 讨论(0)
  • 2020-11-22 02:09

    Using LINQ to manipulate data 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();
    
    0 讨论(0)
  • 2020-11-22 02:09

    In my application I found that using LINQ to Datasets with the AsEnumerable() extension for DataTable as suggested in the answer was extremely slow. If you're interested in optimizing for speed, use James Newtonking's Json.Net library (http://james.newtonking.com/json/help/index.html)

    // Serialize the DataTable to a json string
    string serializedTable = JsonConvert.SerializeObject(myDataTable);    
    Jarray dataRows = Jarray.Parse(serializedTable);
    
    // Run the LINQ query
    List<JToken> results = (from row in dataRows
                        where (int) row["ans_key"] == 42
                        select row).ToList();
    
    // If you need the results to be in a DataTable
    string jsonResults = JsonConvert.SerializeObject(results);
    DataTable resultsTable = JsonConvert.DeserializeObject<DataTable>(jsonResults);
    
    0 讨论(0)
提交回复
热议问题