【问题标题】:LINQ query copytodatatableLINQ 查询复制到数据表
【发布时间】:2015-05-06 05:01:17
【问题描述】:

我有一个正在计算特定数据的 linq 查询。现在我希望将该查询类型转换为DataTable。这是查询:

var query = dt.AsEnumerable()
    .GroupBy(row => new
    {
        Name = row.Field<string>("Name")
    })
    .Select(g => new
    {
        Name = g.Key.wcName,
        quantity = g.Count()
    });

我听说过这里使用的.CopyToDataTable,但它没有显示。如何将查询转换为数据表?

【问题讨论】:

  • 你为什么使用 dt.AsEnumerable().GroupBy() 而不仅仅是 dt.GroupBy() ?
  • 不,它给出了错误'System.Data.DataTable' does not contain a definition for 'GroupBy' and no extension method 'GroupBy' accepting a first argument of type 'System.Data.DataTable' could be found

标签: c# linq


【解决方案1】:

首先使用架构创建一个表,然后使用IEnumerable&lt;DataRow&gt; 的结果选择以使用CopyToDataTable()

var temp = new DataTable();
temp.Columns.Add("Name", typeof(string));
temp.Columns.Add("Quantity", typeof(int));

var query = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Name"))
    .Select(g =>
    {
        var row = temp.NewRow();
        row.SetField("Name", g.Key);
        row.SetField("Quantity", g.Count());
        return row;
    }).CopyToDataTable();

【讨论】:

  • 新建的DataTable为空。 temp 中没有插入数据
  • row.SetField("Quantity", g.Count()); 之后添加temp.Rows.Add(row); 将起作用
  • @bogojane Opps,我还应该编辑 query 的名称。变量query 已经是结果DataTable,而不是temp
【解决方案2】:
public static class DataTableToListHelper
    {      
    public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
    {
        try
        {
            List<T> list = new List<T>();

            foreach (var row in table.AsEnumerable())
            {
                T obj = new T();

                foreach (var prop in obj.GetType().GetProperties())
                {
                    try
                    {
                        PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                        propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                    }
                    catch
                    {
                        continue;
                    }
                }

                list.Add(obj);
            }

            return list;
        }
        catch (Exception ex)
        {                
            return null;
        }
    }
}
DataTable dt = new DataTable();
connection.Open();
adapter.Fill(dt);
connection.Close();
var entityObjectList = dt.DataTableToList<YOURENTITY>();

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2010-10-10
    • 2016-03-06
    • 2018-04-20
    相关资源
    最近更新 更多