convert linq query results to datatable C#

前端 未结 3 372
无人及你
无人及你 2020-12-21 05:06

I want to convert the linq query results to datatable so that I can assign datatable to GridView to show it on asp page.

However I am not able to convert the results

相关标签:
3条回答
  • 2020-12-21 05:27

    If you want to have you own extension method then you could always do something like this:

        public static DataTable ToDataTable<T>(this IQueryable items)
        {
            Type type = typeof(T);
    
            var props = TypeDescriptor.GetProperties(type)
                                      .Cast<PropertyDescriptor>()
                                      .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
                                      .Where(propertyInfo => propertyInfo.IsReadOnly == false)
                                      .ToArray();
    
            var table = new DataTable();
    
            foreach (var propertyInfo in props)
            {
                table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
            }
    
            foreach (var item in items)
            {
                table.Rows.Add(props.Select(property => property.GetValue(item)).ToArray());
            }
    
            return table;
        }
    

    You will need to reference both of these

    using System.ComponentModel;
    using System.Data;
    
    0 讨论(0)
  • 2020-12-21 05:33

    First declare a new DataTable and add columns, in this :

    DataTable dt = new DataTable();
    dt.Columns.Add("FirstName");
    dt.Columns.Add("LastName");
    DataRow row = null;
    

    Now I simply iterate through the query and fill a DataTable:

    foreach (var rowObj in query)
    {
        row = dt.NewRow();
        dt.Rows.Add(rowObj.FirstName, rowObj.LastName);
    }
    
    0 讨论(0)
  • 2020-12-21 05:34

    You should get DataTableExtensions.CopyToDataTable

    Remove ToList().

    CopyToDataTable is an IEnumerable<DataRow> extension (unfortunately).

    There is a solution with custom CopyToDataTable extension method below.

    var gradeData = (from data in oAngieCtxt.prc_ShopInstanceCustomersData(
                     Convert.ToInt32(this.ShopInstanceID), 10000, false)
                    .Where( row => row.RecievedPoints != "n/a" )
                    .GroupBy(row => new { row.Name })
                    .Select(g => new
                    {
                        Name = g.Key.Name,
                        TotalPoints = g.Sum(x => Convert.ToDouble(x.RecievedPoints) 
                        * (x.Weightage.ToString() == "0.00" ? 1 
                          : Convert.ToDouble(x.Weightage)))
                    })
                     select data);
    
    var dt = gradeData.CopyToDataTable();
    

    Edit:

    Here is a more useful implementation of CopyToDataTable There is no type constraint to DataRow.

      public static class DataSetLinqOperators
      {
        public static DataTable CopyToDataTable<T>(this IEnumerable<T> source)
        {
            //you find the ObjectShredder implementation on the blog wich was linked.
            return new ObjectShredder<T>().Shred(source, null, null);
        }
    
        public static DataTable CopyToDataTable<T>(this IEnumerable<T> source, 
                                         DataTable table, LoadOption? options)
        {
            return new ObjectShredder<T>().Shred(source, table, options);
        }
    
      }
    
    0 讨论(0)
提交回复
热议问题