2014-05-14 90 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 –