c# - 使用 Linq 获取前 10 个客户

标签 c# linq

我有以下两个POCO

public class Customers
{
    public Guid Id { get; set; }
    public string FirstName{ get; set; }
    public string LastName{ get; set; }
}

public class Orders
{
    public Guid Id { get; set; }
    public Guid CustomerId { get; set; }
    public string Product { get; set; }
    public DateTime Date { get; set; }
}

假设我的数据服务返回一个 List 和 List,我将如何使用 Linq 获取前 10 个最活跃的客户(大多数订单)?

我想返回 Customer.Id、Customer.FirstName、Customer.LastName、Count(作为来自 Controller 操作的 Json),因此我创建了一个新的 POCO 来保存结果。类似于以下内容:

public class MostActive
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Count { get; set; }
}

虽然它不起作用,但到目前为止,这是我目前的尝试:

var results = (from c in Customers
              from o in Orders
              where c.Id == o.CustomerId
              orderby c.Id.Count descending
              select new MostActive
                  {
                      FirstName = c.FirstName,
                      LastName = c.LastName,
                      Id = c.Id,
                      Count = h.Id.Count
                  }).Take(10);

最佳答案

这涉及几个步骤,您可以将其分解为:

  1. 按客户 ID 分组订单
  2. 按总数对分组进行排序
  3. 获得前 10 名
  4. 关联相关客户
  5. 创建结果对象

应该这样做:

var results = Orders
    .GroupBy(o => o.CustomerId)
    .OrderByDescending(og => og.Count())
    .Take(10)
    .Select(og => new {
        Customer = Customers.Single(c => c.Id.Equals(og.Key)),
        Orders = og
    })
    .Select(c => new MostActive {
        Id = c.Customer.Id,
        FirstName = c.Customer.FirstName,
        LastName = c.Customer.LastName,
        Count = c.Orders.Count()
    });

或者从你开始的地方继续,也就是接近那里,这也可以。正如您所说,主要部分是添加分组,然后加入客户:

var results = (
    from o in Orders
    group o by o.CustomerId into og // create a grouping of orders by customerID
    orderby og.Count() descending // sort by number of orders in each grouping
    join c in Customers on og.Key equals c.Id // og.Key is the grouping Key (CustomerId)
    select new MostActive
    {
        FirstName = c.FirstName,
        LastName = c.LastName,
        Id = c.Id,
        Count = og.Count()
    }).Take(10);

关于c# - 使用 Linq 获取前 10 个客户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323230/

相关文章:

c# - 三元?运算符与 C# 中的传统 If-else 运算符

C# 数据读取器错误

c# - 需要帮助完成或重写此算法以导航通用集合

C# : How to compare Dictionary Values?

c# - 获取嵌套属性及其父项的全名

c# - EmailAddressAttribute 错误地将法语电子邮件地址归类为无效

c# - LINQ to Entity Framework 多重连接与多个动态搜索条件

c# - LINQ OrderByDescending 到 OrderByAscending?

asp.net - 使用匿名类型更新 LINQ 结果时出现问题...只读?

c# - MVC 5 Identity 2.0 在登录时显示配置文件完成情况