1. 程式人生 > >LINQ TO SQL 實現行轉列

LINQ TO SQL 實現行轉列

表結構如下:

id          NAME                 result 
----------- -------------------- ------ 
1           jim                  勝 
2           jim                  勝 
3           jim                  負 
4           Tom                  勝 
5           Tom                  負 
6           Sam                  負 
7           Sam                  負

想得到的結果是:

NAME                 勝           負 
-------------------- ----------- ----------- 
jim                  2           1 
Sam                  0           2 
Tom                  1           1

SQL可以這樣來實現:

SELECT t1.name,
 
  (SELECTCOUNT(1)FROM temp t2 WHERE t2.NAME=t1.NAME AND t2.result='勝')AS'勝',
 
  (SELECTCOUNT(1)FROM temp t3 WHERE t3.NAME=t1.NAME AND t3.result='負')AS'負'
 
FROM
 
(SELECT NAME FROM temp GROUPBY NAME ) AS t1
name                勝          負
-------------------- ----------- -----------
jim                 2           1
Sam                 0           2
Tom                 1           1
(3row(s) affected)

用LINQ怎麼來寫呢?

var query=from t in Temps
    group t by t.NAMEinto m
    selectnew
    { 
      NAME=m.Key, 
      勝=m.Count(n=>n.Result=="勝"),
      負=m.Count(n=>n.Result=="負")
    };

這是LINQ翻譯成的SQL語句:

-- Region Parameters
 
DECLARE
 
@p0 NVarChar(1) = N''
 
DECLARE
 
@p1 NVarChar(1) = N''
-- EndRegion
 
 
SELECT
[t1]
[NAME], (
SELECT COUNT(*)
FROM [temp] AS
[t2] 
WHERE ([t2]
[result] = @p0) AND ((([t1]
[NAME] IS NULL) AND ([t2]
[NAME] IS NULL)) OR (([t1]
[NAME] IS NOT NULL) AND ([t2]
[NAME] IS NOT NULL) AND ([t1]
[NAME] = [t2]
[NAME])))
) AS [], (
SELECT COUNT(*)
FROM [temp] AS
[t3]
WHERE ([t3]
[result] = @p1) AND ((([t1]
[NAME] IS NULL) AND ([t3]
[NAME] IS NULL)) OR (([t1]
[NAME] IS NOT NULL) AND ([t3]
[NAME] IS NOT NULL) AND ([t1]
[NAME] = [t3]
[NAME])))
) AS
[]
FROM
(
SELECT [t0]
[NAME]
FROM [temp] AS
[t0]
GROUP BY [t0]
[NAME] 
) AS
[t1]