假設有一張表如圖:c#
不少時候,咱們但願它以一條數據顯示出來,而不是分多條顯示。好比:ide
張三 語文,英語,物理
李四 數學,化學
咱們能夠用兩種方式能夠來實現。第一種用c#代碼在程序裏進行拼接,好比我能夠這樣去實現,我先查出ID,Name,而後遍歷的時候,經過ID去查詢Course,而後在一塊兒返回數據。例:spa
1 static Func<DataTable, List<string>> ConvertToList = dt => { 2 3 var result = new List<string>(); 4 5 foreach (DataRow dr in dt.Rows) { 6 7 result.Add(dr[0].ToString()); 8 } 9 10 return result; 11 12 }; 13 14 15 query.ForEach(m => result.Add(new Student { 16 ID = m.ID, 17 Name = m.Name, 18 Course = string.Join(",", ConvertToList(dt)) 19 20 }));
第二種用 for xml path 直接把數據查詢出來。(之前知道這個東西,但印象不深,今天才知道能夠這樣實現 -_-||)code
1 select name,stuff((select ','+Course from Student 2 where name = '張三' for xml path('')),1,1,'') 3 from Student where name = '張三' 4 group by name
stuff是用來去除字符串第一個位置的「,」。xml
for xml path 不只是用來拼接,它還能夠返回xml數據類型blog
select * from Student for xml path
結果:字符串
1 <row> 2 <ID>1</ID> 3 <Name>張三</Name> 4 <Course>語文</Course> 5 </row> 6 <row> 7 <ID>2</ID> 8 <Name>李四</Name> 9 <Course>數學</Course> 10 </row> 11 <row> 12 <ID>3</ID> 13 <Name>張三</Name> 14 <Course>英語</Course> 15 </row> 16 <row> 17 <ID>4</ID> 18 <Name>張三</Name> 19 <Course>物?理¤¨ª</Course> 20 </row> 21 <row> 22 <ID>5</ID> 23 <Name>李四</Name> 24 <Course>化學</Course> 25 </row>
若是要自定義列名,也像日常寫SQL語句同樣,用AS就能夠了.數學
select ID as '自定義列名',Name as '自定義列名',Course as '自定義列名' from Student for xml path('自定義根節點')