【问题标题】:Need to solve C# Error u003Ef__AnonymousType0需要解决 C# 错误 u003Ef__AnonymousType0
【发布时间】:2017-04-11 15:30:20
【问题描述】:

我有一个如下的 c# 代码,它在IEnumerable<\u003C\u003Ef__AnonymousType0 处显示错误 谁能告诉我如何解决它。

dataSet = this.GetData.getInfo("SELECT b.nBatchID, td.F_Name &' '& td.M_Name &' '& td.L_Name AS StaffName, b.BatchName FROM (Batch AS b LEFT JOIN BatchTrainer AS bt ON b.nBatchID = bt.nBatchId) LEFT JOIN TrainerDetails AS td ON bt.TrainerId = td.TrainerID", "Batch");
            IEnumerable<\u003C\u003Ef__AnonymousType0<object, string, string>> datas = dataSet.Tables[0].Copy().AsEnumerable().GroupBy<DataRow, object>((Func<DataRow, object>) (row => row["nBatchId"])).Select(g =>
            {
              var data = new{ id = g.Key, text = string.Join(",", g.Select<DataRow, string>((Func<DataRow, string>) (r => r["StaffName"].ToString())).ToArray<string>()), Batch = g.Select<DataRow, string>((Func<DataRow, string>) (r => r["BatchName"].ToString())).FirstOrDefault<string>() };
              return data;
            });
            table.Columns.Add("nBatchId", typeof (int));
            table.Columns.Add("StaffName", typeof (string));
            table.Columns.Add("BatchName", typeof (string));
            foreach (var data in datas)
              table.Rows.Add(data.id, (object) data.text, (object) data.Batch);
            dataSet.Tables.Clear();
            dataSet.Tables.Add(table);

【问题讨论】:

  • 不要从反编译器中复制粘贴代码。它们不一定会生成正确的代码。

标签: c# linq linq-to-dataset


【解决方案1】:

在处理匿名类型时不要指定类型名称。改用var 为您制作编译器推断类型:

var datas = dataSet.Tables[0].Copy().AsEnumerable()
             .GroupBy(row => row.Field<int>("nBatchId"))
             .Select(g => new { 
                 id = g.Key, 
                 text = string.Join(",", g.Select(r => r.Field<string>("StaffName")),
                 Batch = g.Select(r => r.Field<string>("BatchName")).FirstOrDefault()
             });

其他注意事项:

  • 不要为 LINQ 扩展方法指定泛型参数。编译器将从源序列的类型推断通用参数
  • 不要为 LINQ 扩展方法指定谓词类型。同上,编译器会根据源序列推断类型
  • DataRow 使用Field&lt;T&gt;("columnName") 扩展名来获得键入良好的单元格值
  • 不要仅为查询而创建 DataTable 的副本。 LINQ 不会修改原始 DataTable
  • 不要将传递给String.Join 方法的值放入数组中。有接受IEnumerable&lt;T&gt;的方法重载

【讨论】:

  • 谢谢你解决了我的大问题..基本上我从某个地方得到了这段代码..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多