如何将以下查询转换为 Linq 表达式?
SELECT p.playerid,
(SELECT SUM(d.runs)
FROM deliveries d
INNER JOIN overs o ON d.overid = o.overid
WHERE o.isbatting = 1
AND o.gameid = 5
AND d.player_playerid = playerid) AS runsfor,
(SELECT SUM(d.runs)
FROM deliveries d
INNER JOIN overs o
ON d.overid = o.overid
WHERE o.isbatting = 0
AND o.gameid = 5
AND d.player_playerid = playerid) AS runsagainst,
( (SELECT SUM(d.runs)
FROM deliveries d
INNER JOIN overs o ON d.overid = o.overid
WHERE o.isbatting = 1
AND o.gameid = 5
AND d.player_playerid = playerid) -
(SELECT SUM(d.runs)
FROM deliveries d
INNER JOIN overs o ON d.overid = o.overid
WHERE o.isbatting = 0
AND o.gameid = 5
AND d.player_playerid =
playerid) ) AS runscontributed
FROM deliveries d
INNER JOIN players p ON d.player_playerid = p.playerid
INNER JOIN overs o ON d.overid = o.overid
WHERE o.gameid = 1
GROUP BY p.playerid
生成的结果如下所示:
2 13 16 -3
4 -5 18 -23
5 -6 11 -17
7 4 1 3
8 5 7 -2
9 12 17 -5
10 -4 24 -28
12 19 1 18
最佳答案
从简化开始。
SELECT d.*, o.*
FROM deliveries d
INNER JOIN overs o ON d.overid = o.overid
var joined = from d in deliveries
join o in overs on d.overid equals o.overid
select new { d, o };
然后再简化一些...
SELECT SUM(d.runs)
FROM deliveries d
INNER JOIN overs o ON d.overid = o.overid
WHERE o.isbatting = 1
AND o.gameid = 5
AND d.player_playerid = playerid
(from j in joined
where j.o.isBatting
&& j.o.gameId == 5
&& j.d.player.playerId == playerId
select j.d.runs).Sum();
起泡沫,冲洗,重复:
var joined = from d in deliveries
join players p on d.player_playerid equals p.playerid
join o in overs on d.overid equals o.overid;
where j.o.gameid = 1
select new { p, d, o };
var _runsfor = from j in joined
where j.o.isBatting
&& j.o.gameId == 5
&& j.d.player.playerId == some_player_id
select j;
var ungrouped = from j in joined
select new
{
playerId = j.p.playerid,
runsFor = _runsfor.Where(r => r.p.playerId == j.p.playerId)
.Sum(jn => jn.d.runs),
runsAgainst = //etc...
};
var grouped = from u in ungrouped
group new { u.runsFor, u.runsAgainst, /* etc... */ }
by u.playerId into player
select player;
我不确定这是否会达到您想要的效果,但它应该为您提供一个起点。
不要直接使用此代码;我徒手写的,我不确定如果不进行一些调整它第一次就能工作。这里真正的重点是简化。将 SQL 查询分成更小的组并为它们编写 LINQ。然后再编写一些 LINQ 将它们连接在一起。能够做到这一点是 LINQ 最好的事情之一。
关于sql - 如何将带有子查询的复杂 SQL 查询转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377155/