尝试通过查询将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();
答案 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。虽然这很有用,但它不允许从一系列标量类型,项目匿名类型的查询或执行表连接的查询创建表。