对DataTable进行Linq分组查询
本文关键字:查询 Linq DataTable 进行 | 更新日期: 2023-09-27 18:11:19
试图通过查询将Linq组返回到数据表中。获取错误
不能隐式转换类型"System.Collections.Generic.IEnumerable
我正在查询一个名为vendor的数据表,其中数据如下:
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();
这不会起作用,因为您正在将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源上操作。虽然这很有用,但它不允许从标量类型序列、投影匿名类型的查询或执行表连接的查询创建表。