将具有多个连接的SQL转换为LINQ

时间:2014-05-14 05:15:39

标签: sql linq sql-to-linq-conversion

我想知道如何在C#中将以下sql语句更改为Linq或Lambda Extension

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。

万分感谢。

1 个答案:

答案 0 :(得分:1)

我不是LINQ的专家,但是因为没有其他人回答过,所以这就是了!

首先,你不能(AFAIK)对除equals之外的任何东西进行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。

没有任何样本数据,我无法对此进行测试,但我希望它足以让您指出正确的方向!