2016-03-03 49 views
0

在下面的代碼中,我返回將具有可變列數的數據。 因此,它可能會返回列'a,b,c,d,e'或它可能會返回列'a,b,c,g,m,n' - 前三列已設置,但隨後可能有任何數字的附加列。然後我需要將數據作爲匿名類型列表返回。在下面的代碼中,我展示瞭如何獲取數據,將其轉換爲數據,然後將這些列添加到ArrayList objDataColumn中,然後創建一個datatable,它使我接近,但我無法弄清楚如何返回數據列表。C#Linq可變列的數據透視表數據

而是讓它返回的datatable行的名單,我想有它返回匿名類型的泛型列表如下內容(在這種情況下,「屬性」是唯一的動態列):

{ EntitlementId = 477653184, FileSetTypeID = 146, FileTypeCode = "test", SourceSystemKey = "userkey", Entitlement = "Chg Mgrs - AppDev Sour GUI", Attribute = "Change Manager" } 

    ////Applying linq for geting pivot output 
      var d = (from f in result 
        group f by new { f.EntitlementId, f.FileSetTypeID, f.FileTypeCode, f.SourceSystemKey, f.Entitlement } 
         into myGroup 
         where myGroup.Count() > 0 
         select new 
         { 
          myGroup.Key.EntitlementId, 
          myGroup.Key.FileSetTypeID, 
          myGroup.Key.FileTypeCode, 
          myGroup.Key.SourceSystemKey, 
          myGroup.Key.Entitlement, 
          ColumnName = myGroup.GroupBy(f => f.ColumnName).Select(m => new { Col = m.Key, Value = m.Max(c => c.Value) }) 
         }).ToList(); 

      //PART 2 - Distinct ColumnName 
      var cols = (
         from a in result 
         select new { ColumnName = a.ColumnName } 
         ).Distinct().ToList(); 

      //PART 3 - Creating array for adding dynamic columns 
      ArrayList objDataColumn = new ArrayList(); 

      //Fixed columns 
      objDataColumn.Add("FileTypeCode"); 
      objDataColumn.Add("SourceSystemKey"); 
      objDataColumn.Add("Entitlement"); 

      //Add Subject Name as column in Datatable 
      for (int i = 0; i < cols.Count; i++) 
      { 
       objDataColumn.Add(cols[i].ColumnName); 
      } 


      //Add dynamic columns name to datatable dt 

      DataTable dt = new DataTable(); 
      for (int i = 0; i < objDataColumn.Count; i++) 
      { 
       dt.Columns.Add(objDataColumn[i].ToString()); 
      } 

      //PART 4 - Add data into datatable with respect to dynamic columns and dynamic data 
      for (int i = 0; i < d.Count; i++) 
      { 
       List<string> tempList = new List<string>(); 
       tempList.Add(result[i].FileTypeCode.ToString()); 
       tempList.Add(result[i].SourceSystemKey.ToString()); 
       tempList.Add(result[i].Entitlement.ToString()); 

       var res = d[i].ColumnName.ToList(); 
       for (int j = 0; j < res.Count; j++) 
       { 
        tempList.Add(res[j].Value.ToString()); 
       } 

       dt.Rows.Add(tempList.ToArray<string>()); 
      } 

      //END PIVOT 

      IEnumerable<DataRow> rows = dt.AsEnumerable(); 

在此先感謝,讓我知道是否需要任何其他信息,希望這不是太混亂。

+2

匿名類型是編譯器的功能,因此無法在運行時動態創建的。 –

+0

我相信如果你多描述一下你的最終目標是什麼,它會有所幫助。 我這樣說是因爲你的最終目標有點不清楚,似乎可能有一種更簡單的方法來達到你想要的位置。 你是否試圖動態生成類?或者只是一個動態的數據結構? 你在這裏有一些很好的代碼,但是它可能過分地涉及你想要的東西? – DaniDev

+0

感謝您的回覆,我的最終目標是我必須使用IEnumerable對象填充devexpress mvc gridview。在我的代碼中使用datatable方法是不必要的,只是試圖正確地獲取數據格式。由於屬性將根據輸入參數而變化,這是棘手的部分。 – jaykzoo

回答

1

能夠使用動態列表和ExpandoObject類來解決此問題。 下面的代碼,希望它可以幫助別人:

List<dynamic> dynList = new List<dynamic>(); 
      for (int i = 0; i < d.Count; i++) 
      { 
       dynamic dynObj = new ExpandoObject(); 
       ((IDictionary<string, object>)dynObj).Add("FileTypeCode", result[i].FileTypeCode.ToString()); 
       ((IDictionary<string, object>)dynObj).Add("Fullname", result[i].Fullname.ToString()); 
       ((IDictionary<string, object>)dynObj).Add("Entitlement", result[i].Entitlement.ToString()); 

       var res = d[i].ColumnName.ToList(); 
       for (int j = 0; j < res.Count; j++) 
       { 
        ((IDictionary<string, object>)dynObj).Add(res[j].Col.ToString(), res[j].Value.ToString()); 
       } 

       dynList.Add(dynObj); 
      } 
      var dList = (from da in dynList select da).ToList(); 

      return dList;