微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架 - 按一列分组并选择多列

如何解决实体框架 - 按一列分组并选择多列

我在我的 API 中使用了此方法,我试图过滤掉用户 (userId) 并按 EventId 分组。然后我想从表中选择三列:nameeventIdUserId

这是我的代码,但它不起作用:

[HttpGet("[action]/{userId}")]
public IActionResult EventsMatchFiltered(int userId)
{
    var events = _dbContext.Events.Where(event1 => event1.UserId != userId)
       .GroupBy(g => new {g.EventId })
       .SelectMany(g => g.Select(h => new 
       {
           Name = h.Name,h.EventId,h.UserId 
       }));
    return Ok(events);
}

解决方法

首先,事件将是一个 IQueryable 而不是具体化的集合。其次,它将是一个匿名类型,而不是一个适当的 DTO/ViewModel 可序列化类。第三,您按 EventId 进行分组,但不根据该分组“选择”任何内容。 EventId 听起来像是您应该分组的事件的主键。您确定您实际上不是要按用户分组吗?

通常对于像 Grouped 结果这样的东西,你会有一个像这样的视图模型:

[Serializable]
public class UserEventSummaryViewModel
{
    public int UserId { get; set; }
    public ICollection<EventSummaryViewModel> Events { get; set; } = new List<EventSummaryViewModel>();
}

[Serializable]
public class EventSummaryViewModel
{
    public int EventId { get; set; }
    public string Name { get; set; }
}

然后进行查询和填充:

var otherUserEvents = _dbContext.Events
   .Where(e => e.UserId != userId)
   .GroupBy(g => g.UserId )
   .Select(g => new UserEventSummaryViewModel
   { 
       UserId == g.Key,Events = g.Select(e => new EventSummaryViewModel
       {
           EventId = e.EventId,Name = e.Name
       }).ToList()
   }).ToList();

这将提供按每个其他用户分组的事件结构。如果您需要 UserId 和 UserName,则将 UserName 属性添加到 UserEventSummary 视图模型和 GroupBy 子句中:

.GroupBy(g => new { g.UserId,g.Name } )

并在视图模型中填充这些:

UserId == g.Key.UserId,UserName = g.Key.Name,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?