如何在Linq to SQL中对所有值求和并分配总和的百分比

3
我有一个简单的Linq查询,我想扩展它,以便我可以首先对VoteCount字段中的所有值求和,然后为每个被提名者分配获得的投票百分比。
以下是代码:
              TheVoteDataContext db = new TheVoteDataContext();
    var results = from n in db.Nominees
                  join v in db.Votes on n.VoteID equals v.VoteID
                  select new
                  {
                      Name = n.Name,
                      VoteCount = v.VoteCount,
                      NomineeID = n.NomineeID,
                      VoteID = v.VoteID
                  };
1个回答

7

由于选择每个提名者的单一票数和计算所有票数的总和是两个不同的任务,我无法想到一种在一个查询中高效完成这两个任务的方法。我会简单地分为两步来完成,如下:

var results = from n in db.Nominees
              join v in db.Votes on n.VoteID equals v.VoteID
              select new
              {
                  Name = n.Name,
                  VoteCount = v.VoteCount,
                  NomineeID = n.NomineeID,
                  VoteID = v.VoteID
              };

var sum = (decimal)results.Select(r=>r.VoteCount).Sum();
var resultsWithPercentage = results.Select(r=>new {
                               Name = r.Name,
                               VoteCount = r.VoteCount,
                               NomineeID = r.NomineeID,
                               VoteID = r.VoteID,
                               Percentage = sum != 0 ? (r.VoteCount / sum) * 100 : 0
                            });

您也可以在结果之前计算总和(使用聚合查询),这将使求和任务留给数据库引擎。我认为这样会更慢,但您可以通过尝试来找出答案 :)


1
我在这个解决方案上遇到了编译错误:错误1 属性或索引器“AnonymousType#1.Percentage”无法分配--它是只读的。 - Donnie
你说得对,我忘记了这个(我不经常使用匿名类...)。我通过在最终结果中使用一个新的不同的匿名类来修复了解决方案... - MartinStettner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接