EntityFramework 多个 Group by 查询
Posted
技术标签:
【中文标题】EntityFramework 多个 Group by 查询【英文标题】:EntityFramework multiple Group by query 【发布时间】:2021-09-23 13:28:08 【问题描述】:我想打印每天营业额最高的技术名称。我有订单和订单项目表。我想内部连接这两个表,并使用 Order 表中的“startdate”值和 orderitems 表中的“Quantity”和“finalPrice”。
[HttpPost]
public JsonResult MostGiroOfTechnologies(DateTime startDate, DateTime endDate)
using (TridiContext context = new TridiContext())
var technologies = (from oi in context.OrderItems
join or in context.Orders on oi.OrderId equals or.Id
where (or.Status == 5 || or.Status == 7)
&& startDate < or.CompletedDate
&& or.CompletedDate < endDate
group or by new or.CompletedDate.Date ,oi.Technology into g
select new
startDate = g.Key.Date,
technology = g.Key.Technology
//price = ?
).OrderBy(o => o.startDate).ToList();
return Json(new technologies );
当我按上述方式分组时,我得到了我想要的输出,但价格为空。当我将价格添加到分组依据时,输出比我想要的要多,因为它这次也按价格分组。
public class Order
public int Id get; set;
public int UserId get; set;
public DateTime CreatedDate get; set;
public DateTime CompletedDate get; set;
public DateTime OrderEta get; set;
public int Price get; set;
public long? FinalPrice get; set;
public int Discount get; set;
public int Status get; set;
public int SourceOfferId get; set;
public class OrderItems
public int Id get; set;
public int OrderId get; set;
public string Technology get; set;
public string Material get; set;
public int Quantity get; set;
public long? FinalPrice get; set;
【问题讨论】:
price
应该如何计算?尝试使用g.Sum(...)
。
您将 OrderItems
按 (..) 分组,因此在组内有它们的集合。当然价格不同,你必须决定哪个值是正确的。为什么订单有价格?
@GertArnold 我应该在 group by 中包含价格吗?使用 group by 这样做是否有意义,还是有其他更好的方法?
@benuto 当我在分组依据中包含价格时,具有相同技术的订单会出现在不同的行中,因为它也按价格分组。我想做的事。我会看每天的订单,我需要对订购产品的技术进行分组,得到偏差最大的技术。
@GertArnold ' g.Sum(p=>p.FinalPrice) ' 非常感谢朋友。
【参考方案1】:
这段代码对我有用。
[HttpPost]
public JsonResult MostGiroOfTechnologies(DateTime startDate, DateTime endDate)
using (TridiContext context = new TridiContext())
var technologies = (from oi in context.OrderItems
join or in context.Orders on oi.OrderId equals or.Id
where (or.Status == 5 || or.Status == 7)
&& startDate < or.CompletedDate
&& or.CompletedDate < endDate
group or by new or.CompletedDate.Date ,oi.Technology into g
select new
startDate = g.Key.Date,
technology = g.Key.Technology
price = g.Sum(p=>p.FinalPrice) //this line
).OrderBy(o => o.startDate).ToList();
return Json(new technologies );
【讨论】:
以上是关于EntityFramework 多个 Group by 查询的主要内容,如果未能解决你的问题,请参考以下文章
C# + EntityFramework:通过查询将多个组转换为嵌套 JSON
EntityFramework 6.x多个上下文迁移实现分布式事务
EntityFramework中多个dbcontext中的每个请求的事务
MVC5 Identity + EntityFramework 中的多个上下文
我想在 dotnetcore web api 控制器中使用 linq 方法通过 entityframework 从多个表中获取数据