通过Linq订购的大多数产品

本文关键字:大多数 Linq 通过 | 更新日期: 2023-09-27 18:19:02

我有以下两个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,我如何使用Linq来获得订购最多的产品?

我想返回Order。Id、秩序。Product和Count(作为来自控制器动作的Json),所以我还需要创建一个新的POCO来保存结果。如下所示:

public class CustomerOrders
{
    public Guid OrderId { get; set; }
    public string Product { get; set; }
    public int Count { get; set; }
}

通过Linq订购的大多数产品

一种方法是:

  1. List<Order> by Product
  2. 项目进入IEnumerable<CustomerOrders>
  3. Count排序结果

所以它看起来像这样:

(from o in orders
 group o by o.Product into og
 select new CustomerOrders { OrderId = og.First().Id, 
                             Product = og.First().Product,
                             Count = og.Count() }
).OrderBy(r=>r.Count)

但是,OrderId没有多大意义,除非它是Ids的列表,因为您想要获得最有序的产品。

编辑:你是正确的,这是正确的语法

试试这个。你不需要客户名单。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Orders> orders = new List<Orders>();
            List<CustomerOrders> customerOrders = new List<CustomerOrders>();
            var productOrders = orders.AsEnumerable()
                .GroupBy(x => x.Product).ToList();
            foreach (var productOrder in productOrders)
            {
                CustomerOrders newOrder = new CustomerOrders();
                customerOrders.Add(newOrder);
                newOrder.OrderId = productOrder.FirstOrDefault().Id;
                newOrder.Product = productOrder.FirstOrDefault().Product;
                newOrder.Count = productOrder.Count();
            }
        }
    }
    public class Orders
    {
        public Guid Id { get; set; }
        public Guid CustomerId { get; set; }
        public string Product { get; set; }
        public DateTime Date { get; set; }
    }
    public class CustomerOrders
    {
        public Guid OrderId { get; set; }
        public string Product { get; set; }
        public int Count { get; set; }
    }
}
​

如果您喜欢使用c#语法而不是linq:

var groupedOrders = orders.GroupBy(o => o.Product); 

这将返回每个Group的igrougroup,其中key是Product name, value是包含该产品的所有订单的IEnumerable

var sortedGroups = groupedOrders.OrderByDescending(g => g.Count());` 

按IEnumerable

顺序的计数降序排序。
var projectedOrders = sortedGroups.Select(x => new CustomerOrders(){OrderId = x.First().Id, 
                                                  Product = x.First().Product, 
                                                  Count = x.Count()});

示例在此提供http://rextester.com/LRMW38599