You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linq GroupBy语句结果转换为List<UserAnswers>的实现疑问

解决Linq GroupBy后转换回List的问题

你当前的代码里,GroupBy会返回IGrouping<int, UserAnswers>类型的集合(假设QuestionId是int类型),而不是直接的UserAnswers对象集合,所以无法直接转换成List<UserAnswers>。要把分组后的内容转回原类型,核心是扁平化分组——也就是取出每个分组里的所有元素。

两种可行的解决方案:

1. 合并所有分组的元素(保留符合条件的所有UserAnswers)

用SelectMany遍历每个分组,把分组内的所有UserAnswers元素合并成一个集合,这样就能直接转成List<UserAnswers>:

public async Task<List<UserAnswers>> GetQuestionsWellAsync(string UserName) // get questions
{
    return await ctx.UserAnswers
        .Where(x => x.UserId == UserName && x.Correct == 1)
        .GroupBy(c => c.QuestionId)
        .Where(grp => grp.Count() > 2)
        .SelectMany(grp => grp) // 扁平化分组,提取所有元素
        .ToListAsync();
}

2. 只保留每个分组的单个元素(比如取分组内第一个元素)

如果不需要保留分组内的所有元素,只需要每个符合条件分组里的某一个元素(比如第一个),可以用Select提取:

public async Task<List<UserAnswers>> GetQuestionsWellAsync(string UserName) // get questions
{
    return await ctx.UserAnswers
        .Where(x => x.UserId == UserName && x.Correct == 1)
        .GroupBy(c => c.QuestionId)
        .Where(grp => grp.Count() > 2)
        .Select(grp => grp.FirstOrDefault()) // 取每个分组的第一个元素
        .ToListAsync();
}

补充说明

GroupBy的本质是把相同QuestionId的UserAnswers归类成组,每个分组是IGrouping对象——包含一个Key(即你分组的QuestionId)和该组下的所有元素。SelectMany的作用就是把这些分组“拆解开”,把所有组内的元素合并成一个连续的集合,这样类型就和你需要的List<UserAnswers>匹配了。

内容的提问来源于stack exchange,提问作者Kevin Grajewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:45:30