2011-11-26 96 views
2

組我有這樣的SQL:LINQ到EF,左聯接和條款

select o.prod_id, SUM(o.[count]) as [count] 
    into #otgr 
    from otgr o 
    where o.[date]<= @date 
    group by o.prod_id 

    select f.prod_id, SUM(f.[count]) as [count] 
    into #factory 
    from factory f 
    where f.[date]<= @date 
    group by f.prod_id 


    select p.name, p.id, f.[count] - ISNULL(o.[count],0) as av_count 
    from products p 
    join #factory f on f.prod_id = p.id 
    left join #otgr o on o.prod_id = p.id 
    where f.[count] - ISNULL(o.[count],0) > 0 

我怎麼能翻譯成Linq的呢?我堅持用這個代碼:

from otgrr in db.otgr 
where otgrr.date <= date 
group otgrr by otgrr.prod_id into otgrs 
from fac in db.factory 
where fac.date <= date 
group fac by fac.prod_id into facs 
from prod in db.products 
join fac2 in facs on prod.id equals fac2.Key 
join otg2 in otgrs.DefaultIfEmpty(new {id = 0, av_count = 0 }) on prod.id equals otg2.Key 
where (fac2.SUM(a=>a.av_count) - otg2.SUM(a=>a.av_count)) > 0 
select new products { id = prod.id, name = prod.name, av_count = (fac2.SUM(a=>a.av_count) - otg2.SUM(a=>a.av_count)) 

謝謝大家,和我的英語不好

+0

什麼是您的具體問題?失敗的地方在哪裏?是否有編譯錯誤? – Polynomial

+0

有時最好回到爲什麼編寫SQL的意圖,然後嘗試用你的類模型和Linq來表達它們,而不關注1:1的翻譯。使用更高效的SQL執行計劃,代碼生成甚至可能讓您感到驚訝! –

回答

0

您還可以檢查LINQPad遺憾。當然,你可以將它分解爲多個LINQ查詢(畢竟,執行是延遲的,所以它將作爲一個單一查詢執行,而不使用臨時表,99%的情況應該更快)。

但在你的情況下,它可以更簡單地寫,用你可能已經設置了導航屬性:

var result= from p in products 
      select new {Name=p.Name, 
         Id = p.Id, 
         Count = p.Factories.Where(f=> f.date <= date).Sum(f=>f.Count) 
           - p.otgrs.Where(o=> o.date <= date).Sum(o=>o.Count) 
         };