2014-05-14 88 views
2

我想知道我可以更改以下SQL語句轉換成的LINQ或拉姆達擴展在C#與多個轉換SQL連接到LINQ

SELECT m.mdes as AgeGroup,COUNT(DISTINCT(mbcd))as "No.of Member" FROM mageg m 
LEFT JOIN (select distinct(mbcd) ,mage 
FROMtevtl 
JOIN mvipm 
ON tevtl.mbcd = mvipm.mvip 
WHERE datm >= '2014-04-01' 
AND datm <= '2014-04-30' 
)vip 
ON m.tage >= vip.mage AND m.fage <= vip.mage 
GROUP BY m.mdes 

我能做到的LINQ聲明的前半部分。不知道如果這是正確的 這裏是上半場。我不知道如何連接左連接。

(from mem in mvipms 
from log in tevtls 
from grp in magegs 
where mem.mage >=grp.fage && mem.mage <=grp.tage && mem.mvip.Equals(log.mbcd) 
&& log.datm >= DateTime.Parse("2014-04-01") && log.datm <= DateTime.Parse("2014-04-30") 
select new {mem.mvip,grp.mdes}).Distinct() 

請指教。我正在使用MSSQL 2008和VS2010。

非常感謝。

+0

實體框架? –

+0

我建議用這樣一個問題,將原始表格和屬性名稱更改爲更加自我解釋的內容。此外,可以通過添加查詢類型的說明來改善問題,例如「用間隔條件分組的左連接」或類似的。當然,樣本數據也會有幫助。 –

回答

1

我不是LINQ的專家,但由於沒有人回答,所以這裏就是!

首先,你不能(AFAIK)在除了等號之外的任何東西上進行LINQ連接,所以你的LEFT JOIN的結構必須改變。部分是爲了調試的目的,同時也爲可讀性,我更願意佈局我的LINQ在一口大小的塊,所以我會做什麼,你的情況是這樣的(假設我理解正確的數據結構):

var vip = (from t in tevtl 
       join v in mvipl 
       on t.mbcd equals v.mvip 
       where t.datm >= new DateTime(2014, 4, 1) && t.datm <= new DateTime(2014, 4, 30) 
       select new { t.mbcd, v.mage }).Distinct(); 
    var mv = from m in magegl 
      from v in vip 
      where m.tage >= v.mage && m.fage <= v.mage 
      select new 
      { 
       m.mdes, 
       v.mbcd 
      }; 
    var gmv = from m in mv 
       group m by new { m.mdes } into grp 
       select new 
       { 
        mdes = grp.Key.mdes, 
        CountMBCD = grp.Count() 
       }; 
    var lj = from m in magegl 
      join v in gmv 
      on m.mdes equals v.mdes into lhs 
      from x in lhs.DefaultIfEmpty() 
      select new 
      { 
       AgeGroup = m.mdes, 
       CountMBCD = x != null ? x.CountMBCD : 0 
      }; 

作爲解釋。 mv是左連接的等價結構,它具有相關的where子句,但顯然它不包含任何空值 - 它相當於INNER JOIN。 gmv是mv上的一個組,因此仍然實際上是一個INNER JOIN。然後,選取缺失的mdes(如果有的話),我使用添加的語法DefaultIfEmpty()重新加入到magel中 - 這會將聯結轉換爲LEFT OUTER JOIN的等效形式。

沒有任何樣本數據,我還沒有能夠測試這個,但我希望它給你足夠的指導你在正確的方向!

+0

你的'mv'查詢是內連接,他需要左連接。 –

+0

@VojtěchDohnal是的,我知道。我在回答中指出了這一點,以及如何添加任何潛在的缺失答案。 lj中的結果集是所需的LEFT JOIN –