我想知道如何在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。
万分感谢。
答案 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。
没有任何样本数据,我无法对此进行测试,但我希望它足以让您指出正确的方向!