2011-06-16 113 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