linq 行转列

这篇博客展示了如何利用LINQ将数据行转换为列的示例。以一个比赛结果表格为例,通过SQL实现从原始数据转换为按选手名区分胜负次数的表格。然后,博主介绍了使用LINQ进行相同转换的代码,并给出了对应的SQL翻译,说明了LINQ在处理此类问题上的应用。
摘要由CSDN通过智能技术生成

表结构如下:

 

[sql]  view plain  copy
 
  1. id          NAME                 result   
  2. ----------- -------------------- ------   
  3. 1           jim                  胜   
  4. 2           jim                  胜   
  5. 3           jim                  负   
  6. 4           Tom                  胜   
  7. 5           Tom                  负   
  8. 6           Sam                  负   
  9. 7           Sam                  负  

 

想得到的结果是:

 

[sql]  view plain  copy
 
  1. NAME                 胜           负   
  2. -------------------- ----------- -----------   
  3. jim                  2           1   
  4. Sam                  0           2   
  5. Tom                  1           1  

 

SQL可以这样来实现:

 

[sql]  view plain  copy
 
  1. SELECT t1.name,  
  2.    
  3.   (SELECTCOUNT(1)FROM temp t2 WHERE t2.NAME=t1.NAME AND t2.result='胜')AS'胜',  
  4.    
  5.   (SELECTCOUNT(1)FROM temp t3 WHERE t3.NAME=t1.NAME AND t3.result='负')AS'负'  
  6.    
  7. FROM  
  8.    
  9. (SELECT NAME FROM temp GROUPBY NAME ) AS t1  
  10. name                胜          负  
  11. -------------------- ----------- -----------  
  12. jim                 2           1  
  13. Sam                 0           2  
  14. Tom                 1           1  
  15. (3row(s) affected)  

 


用LINQ怎么来写呢?

 

[csharp]  view plain  copy
 
  1. var query=from t in Temps  
  2.     group t by t.NAMEinto m  
  3.     selectnew  
  4.     {   
  5.       NAME=m.Key,   
  6.       胜=m.Count(n=>n.Result=="胜"),  
  7.       负=m.Count(n=>n.Result=="负")  
  8.     };  

 


这是LINQ翻译成的SQL语句:

 

[sql]  view plain  copy
 
  1. -- Region Parameters  
  2.    
  3. DECLARE  
  4.    
  5. @p0 NVarChar(1) = N''  
  6.    
  7. DECLARE  
  8.    
  9. @p1 NVarChar(1) = N''  
  10. -- EndRegion  
  11.    
  12.    
  13. SELECT  
  14. [t1]  
  15. [NAME], (  
  16. SELECT COUNT(*)  
  17. FROM [tempAS  
  18. [t2]   
  19. WHERE ([t2]  
  20. [result] = @p0) AND ((([t1]  
  21. [NAMEIS NULLAND ([t2]  
  22. [NAMEIS NULL)) OR (([t1]  
  23. [NAMEIS NOT NULLAND ([t2]  
  24. [NAMEIS NOT NULLAND ([t1]  
  25. [NAME] = [t2]  
  26. [NAME])))  
  27. AS [], (  
  28. SELECT COUNT(*)  
  29. FROM [tempAS  
  30. [t3]  
  31. WHERE ([t3]  
  32. [result] = @p1) AND ((([t1]  
  33. [NAMEIS NULLAND ([t3]  
  34. [NAMEIS NULL)) OR (([t1]  
  35. [NAMEIS NOT NULLAND ([t3]  
  36. [NAMEIS NOT NULLAND ([t1]  
  37. [NAME] = [t3]  
  38. [NAME])))  
  39. AS  
  40. []  
  41. FROM  
  42. (  
  43. SELECT [t0]  
  44. [NAME]  
  45. FROM [tempAS  
  46. [t0]  
  47. GROUP BY [t0]  
  48. [NAME]   
  49. AS  
  50. [t1]  

 

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值