LINQ TO SQL 實現行轉列
阿新 • • 發佈:2019-02-09
表結構如下:
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]