C# 根据子句仅联接和选择第一项

C# 根据子句仅联接和选择第一项,c#,entity-framework-6,C#,Entity Framework 6,我有一个客户和一个订单数据库。 我需要对所有新客户的第一批订单进行统计,并按月统计新客户的第一批订单数量` var date = new DateTime(now.Year - 1, now.Month, 1); db.Orders .Where(o => o.Customer.IsNew && o.OrderDate > date) .GroupBy(o => new { o.OrderDate.Year, o.OrderDate.Month })

我有一个客户和一个订单数据库。 我需要对所有新客户的第一批订单进行统计,并按月统计新客户的第一批订单数量`

var date = new DateTime(now.Year - 1, now.Month, 1);
db.Orders
  .Where(o => o.Customer.IsNew && o.OrderDate > date)
  .GroupBy(o => new { o.OrderDate.Year, o.OrderDate.Month })
  .Select(g => new NewCustomerStatsModel {
     Month = g.Key.Month,
     Year = g.Key.Year,
     Count = g.Count()
  })
  .OrderBy(cs => cs.Year)
  .ThenBy(cs => cs.Month)
  .ToList();
此查询为我提供所有新客户的订单数量,但如果第一个订单日期大于提供的日期,我只需要获取每个新客户的第一个订单的总和

是否可以通过查询(以及如何实现)来实现,或者我是否被迫使用AsEnumerable并在内存中实现

我需要对所有新客户的第一批订单做一些统计

并按月统计新客户的首次订单数量


我能找到解决办法

在适当的指标下,性能相当好

这可能不是一个完美的解决方案,但我无法更新实体,因为它不是我的库

var date = new DateTime(now.Year - 1, now.Month, 1);
var result = db.Orders
  .Where(o => o.Customer.IsNew && o.State != OrderState.Cancelled) // get all orders where the Customer is a new one.
  .GroupBy(o => o.Customer.Id) // group by customer
  .Select(g => g.OrderBy(o => o.OrderDate).FirstOrDefault()) // get the first order for every customer
  .Where(o => o.OrderDate > date) // restrict to the given date
  .GroupBy(o => new { o.OrderDate.Year, o.OrderDate.Month) }) // then group by month
  .Select(g => new NewCustomerStatsModel {
    Month = g.Key.Month,
    Year = g.Key.Year,
    Count = g.Count()
  })
  .OrderBy(g => g.Year)
  .ThenBy(g => g.Month)
  .ToList();

订单的“总和”是如何表示的?订单上的财产?是否计算与订单关联的项目?@StriplingWarrior抱歉,我的意思是我需要所有已订购物品的客户的计数,并将第一个订单的日期用作客户应输入统计数据的日期。如果他只是登记了,没有点任何东西,就不应该被计入统计数字。“IsNew”属性是来自早期迁移的数据。一些客户已经在另一个数据库中,因此他们的第一个订单不应计入当前的“第一个订单”统计数据。我尝试了类似的方法,但问题是customers db没有orders属性。订单链接到customers@Demonia:我想有很多方法可以解决这个问题。最好是将Orders属性(和适当的映射)添加到您的客户模型中。这也是我的想法,但不幸的是,我无法更改结构,它是一个共享dll,我不是这部分代码的所有者。我在一段时间前问过他们,他们无法更改,因为已经编写了太多的依赖项和代码。这就是为什么我要搜索此查询的解决方案。谢谢,我可以在您的帮助下找到解决方案。@Demonia:您也可以将我的解决方案中的
c.Orders
替换为类似
db.Orders.Where(o=>o.CustomerId==c.CustomerId)
var clientCountByFirstOrderMonth = clientFirstOrders 
    .GroupBy(e => new { e.FirstOrder.OrderDate.Year, e.FirstOrder.OrderDate.Month })
    .Select(g => new{g.Key.Year, g.Key.Month, Count = g.Count()}); 
var date = new DateTime(now.Year - 1, now.Month, 1);
var result = db.Orders
  .Where(o => o.Customer.IsNew && o.State != OrderState.Cancelled) // get all orders where the Customer is a new one.
  .GroupBy(o => o.Customer.Id) // group by customer
  .Select(g => g.OrderBy(o => o.OrderDate).FirstOrDefault()) // get the first order for every customer
  .Where(o => o.OrderDate > date) // restrict to the given date
  .GroupBy(o => new { o.OrderDate.Year, o.OrderDate.Month) }) // then group by month
  .Select(g => new NewCustomerStatsModel {
    Month = g.Key.Month,
    Year = g.Key.Year,
    Count = g.Count()
  })
  .OrderBy(g => g.Year)
  .ThenBy(g => g.Month)
  .ToList();