2017-07-31 38 views
-4

我是C#linq的新手。在LINQ中分組和字符串連接C#

我有數據如下結果,

Id | Name | Code 
1 | Go  | GOS 
1 | RES | RECSO 
1 | ICS | ICSO 
2 | Go  | GOS 
2 | ICS | ICSO 

而且我想要的結果如下,

Id | Name  | Code 
1, Go,RES,ICS | GOS,RECSO,ICSO 
2, Go,ICS  | GOS,ICSO 

有一個人提供了這個LINQ查詢,以最優化的方式,因爲我有大數據集。

在此先感謝

+0

你到目前爲止嘗試過什麼?你寫的一些代碼,你遇到過一些錯誤? –

+0

所以你想合併具有相同Id的所有對象到一個對象中? – Looki

+0

[查詢SQL Server以獲取計數數據與填充字符串id另一個表]可能的重複(https://stackoverflow.com/questions/45073289/query-sql-server-to-get-count-data-with-populate- string-id-another-table) –

回答

1
var result = data.GroupBy(g => g.Id) 
.Select(s => new { 
    Id = s.Key, 
    Name = string.Join(",", s.Select(ss => ss.Name)), 
    Code = string.Join(",", s.Select(ss => ss.Code)), 
}); 
+0

雖然這段代碼可能會回答這個問題,但最好解釋這段代碼的工作原理和原因。給你的答案一些背景。 – ItamarG3

0

如何:

的LINQ部分:

List<BeforeData> listBefore = new List<BeforeData>(); 
Dictionary<int, List<AfterData>> listAfter = listBefore 
       .GroupBy(it => it.ID) 
       .ToDictionary(x => x.Key, y => y.Select(z => new AfterData(z.name, z.code)).ToList()); 

假設類:

public class BeforeData 
{ 
    public int ID; 
    public string name, code; 

    public BeforeData(int ID, string name, string code) 
    { 
     this.ID = ID; 
     this.name = name; 
     this.code = code; 
    } 
} 

public class AfterData 
{ 
    public string name, code; 

    public AfterData(string name, string code) 
    { 
     this.name = name; 
     this.code = code; 
    } 
} 

編輯:簡化LINQ

1

你需要按Id您的數據,然後使用string.Join獲得逗號分隔值NameCode

var query = from m in Data 
      group m by m.Id into grp 
      select new {ID = grp.Key 
         ,Name= string.Join(",",grp.Select(g=>g.Name)) 
         ,Code= string.Join(",",grp.Select(g=>g.Code)) }; 

如果您的數據源是EF或LinqtoSQL或任何其他的ORM然後使用Data.AsEnumerable()強制分組和字符串連接在存儲

否則它會給錯誤(EF的情況下),否則將產生SQL查詢的每一行(LinqToSQL)