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

如何用LINQ关联两表,根据UserId获取问题的投票统计结果?

根据用户ID获取参与投票的问题及投票数

表结构

tblQuestion(对应代码中的ctx.TblPolls)

questionId     question       userId
--------------------------------------
1              question 1     1
2              question 2     2

tblVotes(对应代码中的ctx.TblVotes)

voteId         userId        questionId
----------------------------------------
1              1             1
2              2             1
3              3             1
4              1             2 

需求

实现服务端方法public IActionResult GetPollsVoted(string userId),根据传入的userId返回该用户参与投票的所有问题,包含问题ID、问题内容、用户ID、该问题的总投票数。例如传入userId="1"时,返回结果:

questionId      question      userId    voteCount
-------------------------------------------------
1               question 1    1         3
2               question 2    1         1

错误尝试的LINQ代码

polls1 = from c in ctx.TblPolls
         join o in ctx.TblVotes on c.UserId equals o.UserId into g
         group c.UserId by c.Guid into gg
         from d in ctx.TblPolls
         join m in ctx.TblVotes on d.Guid equals m.PollGuid into ggg
         select new { d.Question, Count = ggg.Count() };

注:代码中ctx.TblPolls对应tblQuestion,ctx.TblVotes对应tblVotes;d.Guid对应tblQuestion的questionId,m.PollGuid对应tblVotes的questionId。


正确的LINQ实现

方法一:先筛选用户投票问题,再统计总票数

// 先获取该用户投票过的所有问题ID(去重,避免同一问题重复出现)
var userVotedQuestionIds = ctx.TblVotes
    .Where(v => v.UserId == userId)
    .Select(v => v.QuestionId)
    .Distinct();

// 关联问题表并统计每个问题的总投票数
var result = from q in ctx.TblPolls
             where userVotedQuestionIds.Contains(q.Guid)
             join vote in ctx.TblVotes on q.Guid equals vote.QuestionId into voteGroup
             select new 
             {
                 questionId = q.Guid,
                 question = q.Question,
                 userId = userId,
                 voteCount = voteGroup.Count()
             };

方法二:使用Group Join直接关联统计

var result = from vote in ctx.TblVotes
             where vote.UserId == userId
             join question in ctx.TblPolls 
                 on vote.QuestionId equals question.Guid
             group question by new { question.Guid, question.Question, vote.UserId } into grouped
             select new 
             {
                 questionId = grouped.Key.Guid,
                 question = grouped.Key.Question,
                 userId = grouped.Key.UserId,
                 voteCount = ctx.TblVotes.Count(v => v.QuestionId == grouped.Key.Guid)
             };

方法三:利用导航属性简化(需实体类已配置关联)

如果你的实体类中已经配置了问题与投票的导航属性(比如TblPolls包含Votes集合属性),可以用更简洁的写法:

var result = ctx.TblVotes
    .Where(v => v.UserId == userId)
    .Select(v => v.Poll) // 假设导航属性名为Poll,指向关联的问题
    .Distinct()
    .Select(q => new 
    {
        questionId = q.Guid,
        question = q.Question,
        userId = userId,
        voteCount = q.Votes.Count()
    });

逻辑说明

  1. 先锁定指定用户投票过的问题,通过Where筛选+Distinct去重,避免同一问题在结果中重复出现。
  2. 针对每个筛选出的问题,关联投票表统计该问题的总投票数,确保questionId(代码中的Guid/PollGuid)关联匹配正确。
  3. 最终构造返回对象,包含需求中的所有字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:43:16