对DataTable进行Linq分组查询

本文关键字:查询 Linq DataTable 进行 | 更新日期: 2023-09-27 18:11:19

试图通过查询将Linq组返回到数据表中。获取错误

不能隐式转换类型"System.Collections.Generic.IEnumerableVendor 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();

对DataTable进行Linq分组查询

这不会起作用,因为您正在将alertsDT的原始查询投射到匿名类型中,这将无法由您的IEnumerable<DataRow> Vendor变量引用,因为您的查询是不是 datarow序列。

假设您正在执行分组,并且您也已经用所需的列设置了VendorsDT表,那么阻力最小的路径是修复Vendor变量类型(使用var进行类型推断),然后循环结果以填充第二个表。

var Vendors = /* your unchanged query omitted */ 
foreach (var item in Vendors) 
{
    VendorsDT.Rows.Add(item.Name, item.Vendor);
}

作为一个注释,我已经使用了你的变量名,尽管在c#中习惯使用小写字母开始局部变量名,大写通常留给方法名,属性等。例如,您会喜欢vendors而不是Vendors,喜欢vendorsDT(或vendorsTable)而不是VendorsDT

这是一种更linq的方式

  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();

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

CopyToDataTable方法获取查询结果并将数据复制到DataTable中,DataTable随后可用于数据绑定。然而,CopyToDataTable方法只在泛型参数T为DataRow类型的IEnumerable源上操作。虽然这很有用,但它不允许从标量类型序列、投影匿名类型的查询或执行表连接的查询创建表。