欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linq 行转列

程序员文章站 2022-06-10 15:11:17
...

表结构如下:

 

[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]