如何解决实体框架 - 按一列分组并选择多列
我在我的 API 中使用了此方法,我试图过滤掉用户 (userId
) 并按 EventId
分组。然后我想从表中选择三列:name
、eventId
和 UserId
。
这是我的代码,但它不起作用:
[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 举报,一经查实,本站将立刻删除。