【问题标题】:Group By in HttpGet in ASP NET CoreASP NET Core 中 HttpGet 中的分组依据
【发布时间】: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 不起作用。

标签: c# asp.net-core group-by http-get


【解决方案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() 就足够了。但这是一个订单列表,您可能有一个客户的多个订单。您想为客户丢弃多个订单吗?考虑到业务需求,这应该没有意义,对吧?
  • 我正在做的是,如果企业想查看订单的详细信息,请单击我放置的眼睛按钮,然后它将向他们显示仅来自该客户的所有订单
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2020-06-14
  • 2022-12-09
  • 2017-11-23
相关资源
最近更新 更多