Поскольку выбор отдельных голосов для каждого кандидата и подсчет суммы всех голосов - две разные задачи, я не могу придумать, как сделать это эффективно в одном запросе. Я бы просто сделал это в два шага, как
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
});
Вы также можете вычислить сумму перед результатами (используя совокупный запрос), это оставит задачу суммирования для механизма базы данных. Я считаю, что это будет медленнее, но вы всегда можете узнать, попробовав:)