2

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

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。

太感谢了。

4

1 回答 1

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。

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

于 2017-07-04T09:17:22.633 回答