sql - 如何将带有子查询的复杂 SQL 查询转换为 LINQ

标签 sql linq translation

如何将以下查询转换为 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/

相关文章:

mysql - 每天统计消息数(17 :00 counts for next day) 之后

sql - 我可以在 Oracle 11g 的触发器中阻止插入吗?

c# - LINQ:选择表中每分钟的第一个值

c# - LINQ BeginTransaction 可以使用新的 Context 吗?

c++ - Qt Linguist 是否提供向可编辑的 .ts 文件添加新条目的功能?

sql - oracle 10g中如何缓存函数的查询结果?

mysql - 错误代码 1248,SQL 状态 42000 : Every derived table must have its own alias

linq - 在 FirstOrDefault 之后,对象是否仍然连接到列表?

安卓 Lint : how to ignore missing translation warnings in a regional locale string file that purposely only overrides some default translations?

android - OpenGL-ES:如何在触摸坐标处设置对象?