如何用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() });
逻辑说明
- 先锁定指定用户投票过的问题,通过
Where筛选+Distinct去重,避免同一问题在结果中重复出现。 - 针对每个筛选出的问题,关联投票表统计该问题的总投票数,确保
questionId(代码中的Guid/PollGuid)关联匹配正确。 - 最终构造返回对象,包含需求中的所有字段。
内容的提问来源于stack exchange,提问作者redoc01
相关产品推荐
相关产品推荐

