Linq将查询分组到DataTable

时间:2014-07-04 03:24:09

标签: c# linq datatable

尝试通过查询将Linq组返回到DataTable中。得到错误

  

无法隐式转换类型   'System.Collections.Generic.IEnumerable< AnonymousType#1>'至   'System.Collections.Generic.IEnumerable<&的System.Data.DataRow GT;'。一个   存在显式转换(您是否错过了演员?)

我正在查询名为Vendors的DataTable,其数据如下:

Vendor         Name 
654797         Lowes
897913         Home Depot
800654         Waffle House

供应商在数据库中存储为char(6)并且名称为char ...不要问我原因,我只是在这里工作:)

    DataTable VendorsDT = New DataTable();
    DataColumn VenName = VendorsDT.Columns.Add("Name", typeof (string));
    DataColumn VenCode = VendorsDT.Columns.Add("Vendor", typeof(string));


    IEnumerable<DataRow> Vendors = from row in alertsDT.AsEnumerable()
                                   group row by new { Name = row.Field<string>("Name"), Vendor = row.Field<string>("Vendor") } into z
                                   select new
                                   {
                                        Name = z.Key.Name,
                                        Vendor = z.Key.Vendor,                        

                                   };



    VendorsDT = Vendors.CopyToDataTable();

2 个答案:

答案 0 :(得分:0)

这不起作用,因为您将alertsDT的原始查询投影到匿名类型中,而IEnumerable<DataRow> Vendor变量无法引用该类型,因为您的查询是< em> not 一系列DataRows。

鉴于您正在执行分组,并且您还已经使用所需列设置了VendorsDT表,阻力最小的路径是修复Vendor变量类型(使用{ {1}}用于类型推断)然后遍历结果以填充第二个表。

var

作为一个注释,我已经使用了你的变量名,虽然在C#中使用小写字母来启动局部变量名称,大写字母通常留给方法名称,属性等。所以你会赞成{例如{1}}超过var Vendors = /* your unchanged query omitted */ foreach (var item in Vendors) { VendorsDT.Rows.Add(item.Name, item.Vendor); } vendors(或Vendors)超过vendorsDT

答案 1 :(得分:0)

这是一种更有效的方式

  var query = from row in alertsDT.AsEnumerable()
                      group row by new { Name = row.Field<string>("Name"), Vendor = row.Field<string>("Vendor") } into z
                      select new 
                      {
                        Name=  z.Key.Name,
                        Vendor=  z.Key.Vendor,

                      };
        VendorsDT = query.CopyToDataTable();

这里定义了以下MSDN文章中指定的扩展方法'CopyToDataTable()'。

CopyToDataTable方法获取查询结果并将数据复制到DataTable中,然后可以将其用于数据绑定。但是,CopyToDataTable方法仅在IEnumerable源上运行,其中泛型参数T的类型为DataRow。虽然这很有用,但它不允许从一系列标量类型,项目匿名类型的查询或执行表连接的查询创建表。