如何对投影的 linq 查询的子 table 中的列求和?

How do I sum a column in a child table of a projected linq query?

在投影和分组方面,我对 linq 还是很陌生。如何使用 linq 获取以下 SQL 查询的结果?或者除了 linq 之外还有更好的方法来检索此查询吗?我正在使用 entity framework,我知道我可以对 sql 进行硬编码,但如果有更好的方法,我宁愿不这样做。

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

下面的代码是我到目前为止的代码,但我不确定我将在哪里或如何进行分组,或者这是否可能。

    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
                   select new ShipScheduleViewModel
                   {
                       JobId = j.JobId,
                       Name = j.OrderId + " " + j.Name,
                       ShipDay = ((DateTime)j.ShipDate).Day,
                       ShipVia = st.ShipTypeId,
                       Count = p.DeliveryCnt * p.Quantity
                   };

基本上 group by 语法要求您在分组中说出您想要的内容(在这种情况下,p Products 是您在 select 中聚合的内容) 和您要分组的值(在本例中为 j Jobst.ShipTypeId),最后您将分组分配到一个变量中,您可以在 select 中使用.

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)
               };