2017-04-11 49 views
-3

我有一個C#代碼如下,它在IEnumerable<\u003C\u003Ef__AnonymousType0 顯示錯誤有人可以告訴我如何解決它。需要解決的C#錯誤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); 
+2

爲什麼,哦爲什麼你的代碼中有'IEnumerable <\ u003C \ u003Ef__AnonymousType0 <對象,字符串,字符串>>? –

+2

不要將代碼從反編譯器中複製粘貼。他們不一定會生成正確的代碼。 –

回答

3

當您處理匿名類型時,不要指定類型名稱。使用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擴展方法的謂詞類型。同上,編譯器會推斷出類型從源序列
  • 使用Field<T>("columnName")擴展DataRow得到很好的輸入單元格值
  • 不要只用於查詢它創建數據表的副本。 LINQ將不會修改原始數據表
  • 不要將您傳遞給String.Join方法的值放入數組中。有接受的方法超載IEnumerable<T>
+1

謝謝你解決了我的大問題..基本上我從一些地方得到了這個代碼.. –