EF:.Distinct()和.GroupBy正在撤消我的过滤

时间:2015-06-15 20:30:33

标签: c# entity-framework

我在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进行查询?

3 个答案:

答案 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()之前应该做到这一点!