我在Entity Framework中有一个非常简单的实体层次结构:
-Order
-Customer
- Name
-ProductOrder
- Quantity
- Product
- Name
- Price
我想写一个查询,让前5位客户做更昂贵的订单。
此查询为我提供了此类客户的ID:[10, 10, 3, 3, 2]
context
.Orders
.Select(o => new { CustomerId = o.CustomerId, Value = o.Products.Sum(p => p.Quantity * p.Product.Price) })
.OrderByDescending(x => x.Value)
.Select(x=> x.CustomerId)
.Take(5)
.ToArray()
;
是的,有些客户看似重复,因为已经下了几个大订单。
所以我尝试添加.Distinct()
以避免重复,但我得到了:[1, 2, 3, 4 ,5]
context
.Orders
.Select(o => new { CustomerId = o.CustomerId, Value = o.Products.Sum(p => p.Quantity * p.Product.Price) })
.OrderByDescending(x => x.Value)
.Select(x=> x.CustomerId)
.Distinct()
.Take(5)
.ToArray()
;
渲染所有以前的查询无用。 .GroupBy
也是如此。
如何使用Entity Framework进行查询?
答案 0 :(得分:1)
对项目进行分组或获取不同的项目集是一项不维护排序的操作。在订购数据之前,您需要过滤掉您不想要的项目,以便您应用的订单可以坚持下去。
答案 1 :(得分:1)
您说您希望客户拥有前5大订单,但不会重复任何客户多次。因此,您真正想要的是最大订单的前五大客户。这是一种方法:
context
.Orders
.Select(o => new { Customer = o.Customer, Value = o.Products.Sum(p => p.Quantity * p.Product.Price) })
.GroupBy(o => x.Customer)
.Select(o => new { Customer = o.Key, MaxValue = o.Select(a => a.Value).Max() })
.OrderByDescending(x => x.MaxValue)
.Select(x => x.Customer)
.Take(5)
.ToArray()
;
答案 2 :(得分:-3)
.ToArray()
或.ToList()
在.Distinct()
之前应该做到这一点!