【问题标题】:Linq grouping query to DataTableLinq对DataTable的分组查询
【发布时间】:2014-07-04 03:24:08
【问题描述】:

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

不能隐式转换类型 'System.Collections.Generic.IEnumerable' 到 'System.Collections.Generic.IEnumerable'。一个 存在显式转换(您是否缺少演员表?)

我正在查询一个名为 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();

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    这是行不通的,因为您将 alertsDT 的原始查询投影到匿名类型中,您的 IEnumerable&lt;DataRow&gt; Vendor 变量将无法引用该类型,因为您的查询是 not 一个 DataRows 序列。

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

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

    作为说明,我使用了你的变量名,尽管在 C# 中习惯使用小写字母来开始局部变量名,而大写通常用于方法名、属性等。所以你会喜欢 @例如,987654327@ 超过VendorsvendorsDT(或vendorsTable)超过VendorsDT

    【讨论】:

    • 感谢您的意见,我已经很多年没有这样做了。您的解决方案有效,非常感谢您提供的其他格式提示。
    【解决方案2】:

    这是一种更 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 中,然后可以将其用于数据绑定。但是,CopyToDataTable 方法仅对泛型参数 T 的类型为 DataRow 的 IEnumerable 源进行操作。虽然这很有用,但它不允许从一系列标量类型、从投影匿名类型的查询或从执行表连接的查询创建表。

    【讨论】:

    • 这个查询结果不能做CopyToDataTable()
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多