var TblPolls = new[]
{
new { Guid = 1, Question = "question 1", UserId = 1 },
new { Guid = 2, Question = "question 2", UserId = 2 },
new { Guid = 3, Question = "question 3", UserId = 1 },
};
var TblVotes = new[]
{
new { VoteId = 1, UserId = 1, PollGuid = 1, Value = "No" },
new { VoteId = 2, UserId = 2, PollGuid = 1, Value = "Yes" },
new { VoteId = 3, UserId = 3, PollGuid = 1, Value = "Yes" },
new { VoteId = 4, UserId = 1, PollGuid = 2, Value = "No" },
};
我上面有这些表格,但正如你所看到的,问题3还没有投票。那么我如何仍然提取问题3的TblPolls行的数据,考虑到这个Poll没有投票,所以结果应该是返回问题3的行,但投票中的值为null。我猜这是linq中的一种左连接。我已经尝试过了,但我没有得到我想要的结果:
poll = (
from polls in ctx.TblPolls
join votes in ctx.TblVotes on polls.Guid equals votes.PollGuid into gg
where polls.Guid == guid
from ff in gg.DefaultIfEmpty()
where (ff.UserId == userId || ff.UserId == null) && ff.PollGuid == guid
select new
{
polls.UserId,
polls.Id,
polls.Guid,
polls.Question,
polls.Description,
polls.Date,
polls.VideoId,
value = gg.Where(x => x.UserId == userId && x.PollGuid == guid).FirstOrDefault().Value,
VoteCount = gg.Count(),
}
).ToList();
发生的事情是,如果用户投票不存在的TblPoll问题im得到空数组时,问题应该返回,即使没有投票的用户。
那么,linq查询如何按照我的建议实现reuslts呢?
1条答案
按热度按时间0sgqnhkj1#
您有两个表,
TblPolls
带有Guid
属性,TblVotes
带有UserId
和PollGuid
属性,您希望查找给定poll guid的所有投票,并统计给定用户id的所有投票--或者如果没有投票,则不统计任何投票。您可以使用left outer join执行此操作,如下所示:
注意事项:
join
之前过滤投票的Guid
和投票的UserId
和PollGuid
。TblVotes
的内容是类而不是结构体,因此如果gg
为空,则from ff in gg.DefaultIfEmpty()
将返回null
。那么ff.UserId
将导致异常。TblVotes
没有属性Value
,所以我不知道如何修复既然你已经在循环
gg
了,也许你只是想:演示小提琴here。
redoc01更新:
解决方案几乎就在那里了,我只是修改了这一行:
这一行:
现在工作!...