Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对投影linq查询的子表中的列求和?_C#_Entity Framework_Linq_Projection - Fatal编程技术网

C# 如何对投影linq查询的子表中的列求和?

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

当涉及到投影和分组时,我仍然对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 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)
               };