C# 如何对投影linq查询的子表中的列求和?
当涉及到投影和分组时,我仍然对linq非常熟悉。如何使用linq获得以下SQL查询的结果?或者除了linq之外,还有更好的方法来检索这个查询吗?我使用的是实体框架,我知道我可以硬编码sql,但如果有更好的方法,我宁愿不这样做C# 如何对投影linq查询的子表中的列求和?,c#,entity-framework,linq,projection,C#,Entity Framework,Linq,Projection,当涉及到投影和分组时,我仍然对linq非常熟悉。如何使用linq获得以下SQL查询的结果?或者除了linq之外,还有更好的方法来检索这个查询吗?我使用的是实体框架,我知道我可以硬编码sql,但如果有更好的方法,我宁愿不这样做 SELECT j.JobId, j.Name, j.OrderId, j.ShipDate, st.ShipTypeId, sum(p.DeliveryCnt * p.Quantity) AS 'DeliveryCnt' FROM Jobs j JOIN ShipTo
SELECT j.JobId, j.Name, j.OrderId, j.ShipDate,
st.ShipTypeId, sum(p.DeliveryCnt * p.Quantity) AS 'DeliveryCnt'
FROM Jobs j
JOIN ShipTo st ON j.JobId = st.JobId
JOIN DesignSets ds ON j.JobId = ds.JobId
JOIN DesignSetAreas dsa ON ds.DesignSetId = dsa.DesignSetId
JOIN Products p ON dsa.DesignSetAreaId = p.DesignSetAreaId
WHERE j.ShipDate >= '11/13/2016' AND j.ShipDate <= '11/26/2016'
GROUP BY j.JobId, j.Name, j.OrderId, j.ShipDate, st.ShipTypeId
选择j.JobId、j.Name、j.OrderId、j.ShipDate、,
st.ShipTypeId,金额(p.DeliveryCnt*p.Quantity)为“DeliveryCnt”
来自乔布斯j
在j.JobId=st.JobId上加入ShipTo st
在j.JobId=ds.JobId上连接设计集ds
在ds.DesignSetId=dsa.DesignSetId上加入DesignSetAreas dsa
在dsa上加入产品p.DesignSetAreaId=p.DesignSetAreaId
其中j.ShipDate>='11/13/2016'和j.ShipDate基本上,分组依据
语法要求您在分组中说出所需内容(在本例中,p
产品
是您在选择
中聚合的内容)以及您想要分组依据的值(在这种情况下,j
作业
和st.ShipTypeId
),最后将分组分配到一个变量中,您可以在选择中使用该变量
var shipList = from j in db.Jobs
join st in db.ShipTo on j.JobId equals st.JobId
join ds in db.DesignSets on j.JobId equals ds.JobId
join p in db.Products on ds.DesignSetId equals p.DesignSetId
where j.ShipDate >= startDate && j.ShipDate <= endDate
group p by new { j, st.ShipTypeId } into grp
select new ShipScheduleViewModel
{
JobId = grp.Key.j.JobId,
Name = grp.Key.j.OrderId + " " + grp.Key.j.Name,
ShipDay = ((DateTime)grp.Key.j.ShipDate).Day,
ShipVia = grp.Key.ShipTypeId,
Count = grp.Sum(p => p.DeliveryCnt * p.Quantity)
};
var shipList=来自j,单位为db.Jobs
在j.JobId等于st.JobId的db.ShipTo中加入st
在j.JobId等于ds.JobId的db.designset中连接ds
将p加入ds.DesignSetId上的db.Products等于p.DesignSetId
其中j.ShipDate>=开始日期&j.ShipDate p.DeliveryCnt*p.Quantity)
};
首先,我建议您接受使用导航属性而不是加入。您对导航属性的看法是正确的。它们是一种更干净的编码方式。谢谢你的链接,提醒我还有更好的方法。谢谢你,这是一个非常快速的回应。这正是我所需要的。您在对我的问题的评论中提到使用导航属性。如何使用导航属性获得相同的结果?具体来说,检索“Count”属性。我还需要分组吗?你能给我举个例子吗?导航属性允许你不必指定如何连接表,因为EF已经知道了。它对Count
没有任何影响,因为这是一个聚合函数,而不是一个导航属性。
var shipList = from j in db.Jobs
join st in db.ShipTo on j.JobId equals st.JobId
join ds in db.DesignSets on j.JobId equals ds.JobId
join p in db.Products on ds.DesignSetId equals p.DesignSetId
where j.ShipDate >= startDate && j.ShipDate <= endDate
group p by new { j, st.ShipTypeId } into grp
select new ShipScheduleViewModel
{
JobId = grp.Key.j.JobId,
Name = grp.Key.j.OrderId + " " + grp.Key.j.Name,
ShipDay = ((DateTime)grp.Key.j.ShipDate).Day,
ShipVia = grp.Key.ShipTypeId,
Count = grp.Sum(p => p.DeliveryCnt * p.Quantity)
};