简体   繁体   English

使用在多个列上使用group by和聚合函数将多个表上的多个联接转换为SQL查询

[英]convert SQL query with multiple join on multiple tables using group by on multiple columns and with aggregate function into LINQ

Please help me to convert below query into LINQ syntax. 请帮助我将以下查询转换为LINQ语法。

select am.areaid, am.AreaName, MAX(am.pincode),count(ua.ApartmentID) from areamaster am 
inner join MerchantServiceAreas msa on am.areaid = msa.areaid
left join apartmentmaster apm on am.areaid = apm.areaid
left join useraddress ua on apm.apartmentid = ua.apartmentid
group by am.areaid,am.areaname

I have tried with the following syntax but doesn't work 我尝试使用以下语法,但不起作用

(from ar in Entities.AreaMasters
    join mrs in Entities.MerchantServiceAreas on ar.AreaID equals mrs.AreaID

    join ap in Entities.ApartmentMasters on mrs.AreaID equals ap.AreaID into apl
    from ap1 in apl.DefaultIfEmpty()

    join ua in Entities.UserAddresses on ap1.ApartmentID equals ua.ApartmentID into ual
    from ua1 in ual.DefaultIfEmpty()

    where mrs.MerchantID == MerchantID
    group ar 
    by new
    {
      ar.AreaID,
      ar.AreaName,
      ar.Pincode
    } into uag
    select new AreaComplex
    {
      AreaID = uag.Key.AreaID,
      AreaName = uag.Key.AreaName,
    }).ToList();

in your grouping remove ar.Pincode 在您的分组中删除ar.Pincode

   group ar 
    by new
    {
      ar.AreaID,
      ar.AreaName,
      ***ar.Pincode***
    } into uag

Try Code: 尝试代码:

var result=  (from ar in Entities.AreaMasters
join mrs in Entities.MerchantServiceAreas on ar.AreaID equals mrs.AreaID

join ap in Entities.ApartmentMasters on mrs.AreaID equals ap.AreaID into apl
from ap1 in apl.DefaultIfEmpty()

join ua in Entities.UserAddresses on ap1.ApartmentID equals ua.ApartmentID into ual
from ua1 in ual.DefaultIfEmpty()

where mrs.MerchantID == MerchantID
group new { ar,mrs,ap1,ua1 }
by new
{
  ar.AreaID,
  ar.AreaName      
} into uag
select new AreaComplex
{
  AreaID = uag.FirstOrDefault().ar.AreaID,
  AreaName = uag.FirstOrDefault().ar.AreaName,
  Pincode=  uag.Max(c=>c.ar.pincode),
  Pincode=  uag.Count(c=>c.ua1.ApartmentID),
}).ToList();

Try this syntax , 试试这个语法,

(from am in Entities.AreaMasters.GetQueryable()
 join msa in Entities.MerchantServiceAreas.GetQueryable()
.Where(a=> a.MerchantID == MerchantID) on am.AreaID equals msa.AreaID
join apm in Entities.ApartmentMasters.GetQueryable() on am.AreaID equals 
apm.AreaID into apmjoin from apmlj into apmjoin.DefaultIfEmpty()
join ua in Entities.UserAddresses.GetQueryable() on apmlj.ApartmentID equals 
ua.ApartmentID into uajoin from ualj in uajoin.DefaultIfEmpty()
select new { newAreaID = am.AreaID,newAreaName =  am.AreaName, newPincode= 
am.Pincode})
.GroupBy(a=> new {AreaID = a.newAreaID,AreaName = a.newAreaName,Pincode= 
a.newPincode})
.Select(x=> new AreaComplex { AreaID = x.FirstOrDefault().AreaID,
AreaName = x.FirstOrDefault().AreaName,Pincode = x.Sum(a=>a.Pincode) }).toList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM