2015-10-08 90 views
-1

我正在使用LINQ在我的項目中實體。如何以優雅的方式更改列表<>結構

我有此LINQ:

var result = (from inspArch in inspectionArchives 
      from inspAuth in inspArch.InspectionAuthority    
      select new 
      { 
       Id = inspArch.Id, 
       clientId = inspArch.CustomerId, 
       authId = inspAuth.Id 
      }).ToList(); 

LINQ執行後結果具有此值:

enter image description here

是否有任何優雅的方式(例如,使用LINQ或更改現有以上LINQ)從上面的列表創建,像這樣的新列表:

enter image description here

謝謝您提前。

+3

使用的客戶端ID –

+0

組@ M.kazemAkhgary我tryed,但我需要創建leftand右側 – Michael

+0

@邁克爾陣列 - 檢查我的更新您的錯誤。 –

回答

1

你需要group by,你可以得到的IGrouping適用String.Join: -

var result = (from inspArch in inspectionArchives 
       from inspAuth in inspArch.InspectionAuthority 
       group new { inspArch, inspAuth } by inspArch.CustomerId into g   
       select new 
       { 
        Id = String.Join(",",g.Select(x => x.inspArch.Id), 
        clientId = x.Key, 
        authId = String.Join(",",g.Select(x => x.inspAuth.Id) 
       }).ToList(); 

這裏最棘手的部分是組中的兩個對象即new { inspArch, inspAuth }因爲我們需要從兩個訪問性能。

更新:

由於這是實體框架,它將不能夠在方法String.Join轉換爲SQL,所以我們可以使用AsEnumerable帶回分組的對象到內存中,然後投射像這樣: -

var result = (from inspArch in inspectionArchives 
       from inspAuth in inspArch.InspectionAuthority 
       group new { inspArch, inspAuth } by inspArch.CustomerId into g 
       select g).AsEnumerable() 
         .Select(g => new 
         { 
          Id = String.Join(",",g.Select(x => x.inspArch.Id), 
          clientId = x.Key, 
          authId = String.Join(",",g.Select(x => x.inspAuth.Id) 
         }).ToList(); 
2

我還沒有建立這個來看它是否編譯,但這應該工作。您需要彙總Id和AuthId字段。

var result = (from inspArch in inspectionArchives 
     from inspAuth in inspArch.InspectionAuthority    
     select new 
     { 
      Id = inspArch.Id, 
      clientId = inspArch.CustomerId, 
      authId = inspAuth.Id 
     }) 
.GroupBy(g => g.clientId) 
.select(s => new { 
    Id = string.Join(",", s.Select(ss => ss.Id.ToString())), 
    ClientId = s.Key, 
    AuthId = string.Join(",", s.Select(ss => ss.authId.ToString()).Distinct()), 
}).ToList(); 
+0

感謝發佈。我得到這個異常: LINQ to Entities不能識別方法'System.String加入(System.String,商店表達。 任何想法如何解決它? – Michael

+0

LINQ to Entities無法將.ToString()轉換爲SQL,因此在使用select語句或刪除ToString之前,需要找到一種方法將Id轉換爲字符串(如果它尚未)相信string.Join會將它轉換爲你 – JB06

+0

@Michael,我不確定是否需要.ToString()。你可能可以刪除它。我認爲另一種可能性是強制查詢運行,然後處理結果。我想你可以通過在.GroupBy(...)之前放置一個.ToList()來實現。 – user2023861

相關問題