Как: суммировать все значения и назначить процент от общего количества в Linq для sql - PullRequest
3 голосов
/ 28 августа 2011

У меня есть простой запрос 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 голосов
/ 28 августа 2011

Поскольку выбор отдельных голосов для каждого кандидата и подсчет суммы всех голосов - две разные задачи, я не могу придумать, как сделать это эффективно в одном запросе. Я бы просто сделал это в два шага, как

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
                            });

Вы также можете вычислить сумму перед результатами (используя совокупный запрос), это оставит задачу суммирования для механизма базы данных. Я считаю, что это будет медленнее, но вы всегда можете узнать, попробовав:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...