假设有一张表如图: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('自定义根节点')