ASP NET Core 中 HttpGet 中的分组依据

Posted

技术标签:

【中文标题】ASP NET Core 中 HttpGet 中的分组依据【英文标题】:Group By in HttpGet in ASP NET Core 【发布时间】:2021-11-07 22:31:53 【问题描述】:

我正在一个网页上工作,该网页上有一个客户订单列表。我在 ASP NET Core 中有我的后端,在 Angular 中有我的前端。我面临的问题是,当我使用 group by 发出 get 请求时出现错误

"System.InvalidOperationException: LINQ 表达式'(GroupByShaperExpression: KeySelector: (o.ClientId), 元素选择器:(实体形状表达式: 实体类型:订单 值缓冲区表达式: (ProjectionBindingExpression:EmptyProjectionMember) IsNullable: 假 ) )"

这就是我的web page 的样子。我不希望有重复的记录。

这是我尝试过的:

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Order>>> GetOrders()
    
        return await _database.Orders
                .Include(c => c.Client)
                .GroupBy(c => c.ClientId)
                .Select(c => c.OrderBy(x => x.ClientId).FirstOrDefault())
                .ToListAsync();
    

我在 ASP NET Core 中的课程是:

public class Order

    public int Id  get; set; 
    public int ClientId  get; set; 
    public int ProductId  get; set; 
    public int Quantity  get; set; 
    public double Price  get; set; 
    public Client Client  get; set; 
    public Product Product  get; set; 

更新

我意识到我在课堂上遗漏了一个变量,所以它看起来像这样:

    public class Order
    
        public int Id  get; set; 
        public int ClientId  get; set; 
        public int ProductId  get; set; 
        public int Quantity  get; set; 
        public double Price  get; set; 
        public byte[] Logo  get; set; 
        public Client Client  get; set; 
        public Product Product  get; set; 

【问题讨论】:

对不起,但根据代码,每个订单只有一个客户,所以......这是什么? .GroupBy(c =&gt; c.ClientId).Select(c =&gt; c.OrderBy(x =&gt; x.ClientId).FirstOrDefault()) 如果能把预期的结果说清楚就更好了。 1 位客户可能会下超过 1 个订单。因此结果是正确的,因为它是根据订单查询的。 我不希望有重复的记录。。您是否尝试让每个客户都没有重复?也许Enumerable.Distinct 符合您的要求。 在您 GroubBy Client 之后,选择中的所有客户端都是平等的。如果您需要联系客户,请使用此功能。 .GroupBy(c => c.Client) .Select(c => c.Key) @YongShun 没错,1 个客户可以下超过 1 个订单。我的数据库中有一个图像列,因此 Distinct 不起作用。 【参考方案1】:

我猜您正在尝试根据客户端 ID 对结果进行排序。在这种情况下,您可以尝试:

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Order>>> GetOrders()
    
        return await _database.Orders
                .Include(c => c.Client)
                .GroupBy(c => c.ClientId)
                .OrderBy(c=>c.Key)
                .Select(x=> as your need)
                .ToListAsync();
    

已编辑:根据要求添加选择

【讨论】:

我在代码中遇到此错误:无法将 typ System.Collections.Generic.List>>' 隐式转换为 'Microsoft.AspNetCore.Mvc.ActionResult'跨度> 好吧,您必须根据需要选择结果。如果您不希望根据客户端对结果进行排序,则不需要对结果进行分组。 根据您的结果图像链接,一个简单的 _database.Orders.Include(c=>c.Client).ToListAsync() 就足够了。但这是一个订单列表,您可能有一个客户的多个订单。您想为客户丢弃多个订单吗?考虑到业务需求,这应该没有意义,对吧? 我正在做的是,如果企业想查看订单的详细信息,请单击我放置的眼睛按钮,然后它将向他们显示仅来自该客户的所有订单

以上是关于ASP NET Core 中 HttpGet 中的分组依据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET CORE 3.0 中配置路由以使用带有 [FromQuery] 参数的重载 [HttpGet] 方法?

将数组传递给 asp net core web api 操作方法 HttpGet

ASP.NET Core 中的重定向

ASP.net Core API 中的路由

Asp Net Core uri 参数中的 IDictionary 问题

Asp.Net Core 中控制器方法中的绑定 Guid