score:4

Accepted answer

start out by simplifying.

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 };

then simplify some more...

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();

lather, rinse, repeat:

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;

i'm not certain this will do what you want, but it should give you a jumping off point.

don't use this code directly; i wrote it freehand, and i'm not sure it will work the first time without some tweaking. the real point here is to simplify. break your sql query into smaller groups and write the linq for those. then write some more linq to tie it all together. the ability to do that is one of the best things about linq.


Related Query

More Query from same tag