假设有一张表如图:
很多时候,我们希望它以一条数据显示出来,而不是分多条显示。比如:
张三 语文,英语,物理
李四 数学,化学
我们可以用两种方式可以来实现。第一种用c#代码在程序里进行拼接,比如我可以这样去实现,我先查出ID,Name,然后遍历的时候,通过ID去查询Course,然后在一起返回数据。例:
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 直接把数据查询出来。(以前知道这个东西,但印象不深,今天才知道可以这样实现 -_-||)
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是用来去除字符串第一个位置的“,”。
for xml path 不仅是用来拼接,它还可以返回xml数据类型
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('自定义根节点')