linq 行转列

表结构如下:

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

 
 

猜你喜欢

转载自sangei.iteye.com/blog/2324372
今日推荐