2011-06-16 64 views
2

如何将以下查询转换为Linq表达式?如何将这个带有子查询的复杂SQL查询转换为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 
+0

hmm cool!真酷! – Fredou 2011-06-16 19:07:14

+3

非常非常仔细。 – 2011-06-16 19:10:40

+0

哪一部分如果查询是你挣扎的? – Magnus 2011-06-16 19:31:56

回答

4

通过简化启动出去。

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最棒的事情之一。

+0

这对我来说已经够好了。当我回到我的电脑并编辑(如果)需要时,我会对它有一个破解。非常感激! – 2011-06-16 20:59:00

+0

@ Phil.Wheeler - 很高兴为您提供帮助。可能要特别注意'未分组'查询,包括内部的'Where';我的面前没有你的模式,所以我无法进行测试。 – 2011-06-16 21:06:14

+0

@ Phil.Wheeler - 编辑:采取我自己的建议和简化;我从'未分组'的内部逻辑中分离出'runsfor'。干杯。 – 2011-06-16 21:12:53