C# 如何:对所有值求和,并将Linq中总值的百分比分配给sql

C# 如何:对所有值求和,并将Linq中总值的百分比分配给sql,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有一个简单的linq查询,我正在尝试扩展它,这样我就可以首先对VoteCount字段中的所有值求和,然后为每个被提名人分配被提名人获得的选票百分比 代码如下: TheVoteDataContext db = new TheVoteDataContext(); var results = from n in db.Nominees join v in db.Votes on n.VoteID equals v.VoteID

我有一个简单的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
                  };

由于为每个被提名人选择单个投票和计算所有投票的总和是两项不同的任务,我想不出一种方法可以在一个查询中有效地完成这项任务。我只需分两步来做,如下所示

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属性或索引器“AnonymousType#1.Percentage”无法分配到--它是只读的。您是对的,我忘记了这一点(我不经常使用匿名类…)。我通过在最终结果中使用新的不同匿名类修复了该解决方案。。。