【问题标题】:How to return an array of grouped items?如何返回一组分组项目?
【发布时间】:2020-08-22 10:07:55
【问题描述】:

我有一个简单的GET 请求来返回我的所有元素。但我似乎无法弄清楚如何在分组数组中返回这些元素,按名称和日期分组

我的模特:

public class Event
{
   [Key]
   public long ID { get; set; }

   [Required]
   public DateTime date { get; set; }

   [Required]
   public string name { get; set; }
}

这是我返回所有元素的 GET 请求

[Route("api/events")]
[HttpGet]
public async Task<ActionResult<IEnumerable<Event>>> GetEvents()
{
   return await _context.Events.ToListAsync();
}

【问题讨论】:

  • 你能展示一个你想要产生的结构的例子吗?
  • 你不能,用那个方法签名;它声称 Get 将返回 Event 的枚举——这不是一组事件的数组。分组将具有引用组键名称/日期的对象(集合)和组中事件值的集合。使用该签名可以做的最好的事情是按名称/日期对事件进行排序,远程端可以检测到从一个项目到下一个项目的变化并知道开始一个新组
  • 您的语法看起来不错。您正在代码中定义 getter 和 setter 属性。要返回一个元素,您需要定义一个通常是私有的字段。这就是你想要做的吗?

标签: c# rest linq asp.net-core asp.net-apicontroller


【解决方案1】:

您可以这样定义 DTO:

public class GroupedEventsDto
{
    public DateTime Date { get; set; }
    public string Name { get; set; }

    // although you already know date and name, 
    // so you could have the list of IDs only
    public List<Event> Events { get; set; }
}

然后简单地做:

[HttpGet("api/events")]
public async Task<ActionResult<IEnumerable<GroupedEventsDto>>> GetEvents()
{
    var events = await context.Events.ToArrayAsync();

    var data = events 
       .GroupBy(x => new { x.date, x.name })
       .Select(grp => new GroupedEventsDto
       {
          Date = grp.Key.date,
          Name = grp.Key.name,
          Events = grp.ToList()
        })
        .ToList();

    return data;
}

这会生成一个类似 JSON 的文件

[
    {
        "Name": "a",
        "Date": "2020-08-22",
        "Events": [
            {
                "Name": "a",
                "Date": "2020-08-22",
                "Id": 1
            }, ...
        ]
    },
    {
        "Name": "b",
        "Date": "2020-08-22",
        "Events": [
            {
                "Name": "b",
                "Date": "2020-08-22",
                "Id": 2
            }, ...
        ]
    },
    ...
]

当然,你最终需要的属性会在GroupedEventsDto中改变

【讨论】:

  • 嘿,当我尝试你的代码时,它说:The name X doesn't exist in current context
  • @zalias 小错字,已修复
  • 想法相同,但现在我得到了另一种错误:cannot await 'method group'
  • @zalias 我今天好像不太好 :) 少了一个 )
  • 现在它编译了,谢谢!但是当尝试调用 /api/events 时,我得到 500 状态错误:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2017-09-16
  • 2018-06-10
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多