【发布时间】:2012-08-21 13:23:45
【问题描述】:
我正在尝试创建查询以获取投票结果。
有一张表格记录了某人所做的每一次投票。人们可以多次投票,但只应考虑最后一次投票。
除了“只应考虑用户的最后一票”部分之外,我已经知道它可以工作了。
这是我的桌子:
表投票:
id bigint PK
TimeStamp datetime
QuestionId int
UserId int
和 Linq 查询:
var total = (float)(_db.Votes).Count(vote => vote.Timestamp>=startWeekDay && vote.Timestamp<endWeekDay);
var results = (from vote in _db.Votes
where vote.Timestamp >= startWeekDay && vote.Timestamp < endWeekDay
group vote by new { vote.QuestionId} into g
orderby g.Count() descending
select new VoteResults()
{
QuestionID = g.Key.QuestionId,
Percentage = (g.Count() / total * 100.0f),
}).ToList();
我的问题:如何更改此查询,以便只考虑每个用户的最后一次投票?
编辑: 鉴于此输入:
{
UserId = 1,
QuestionId = 2,
TimeStamp = Yesterday
},
{
UserId = 1,
QuestionId = 1,
TimeStamp = Today
},
{
UserId = 2,
QuestionId = 2,
TimeStamp = Yesterday
},
{
UserId = 3,
QuestionId = 1,
TimeStamp = Yesterday
}
输出应如下所示:
{
QuestionID = 2,
Percentage = 33.3333
},
{
QuestionID = 1,
Percentage = 66.66666
}
【问题讨论】:
-
下载免费的LinqPad 并自己尝试查询,无需编译任何东西......如果你愿意,它甚至可以使用你自己的EntityFramework。
-
我知道 LinqPad。谢谢。只是我被困在如何扩展查询以添加这个额外的要求。我不明白 linqpad 在这里可以如何帮助我。
-
为什么 QuestionID = 2 和 Percentage = 33.333?在这种情况下,g.Count() 和 Total 应该是什么?
-
g.count 和 total 我用来计算百分比的方法。在上面的例子中:33% 的用户投了问题 2,66% 的用户投了问题 1。
-
如果您使用我的旧查询。 questionId 2 的 g.count 为 2,总数为 4。事实上,如果您只考虑每个用户的最后一次投票,它应该是:g.count for questionId 2 为 1(因为投票被新的投票否决),总数应该是 3(因为实际上只有 3 票有效)
标签: c# .net sql-server linq