#sql #linq
#sql #linq
Вопрос:
Мой вопрос: как я могу перевести это в LINQ?
select Reasons.Description, count(*) * 100.0 / sum(count(*)) over() AS Porcentage
from Rejected
iNNER JOIN Reasons
ON Rejected.Reason = Reasons.ReasonID
group by Reasons.Description
Или как я могу заполнить Ilist этим результатом, если я хочу использовать хранимую процедуру.
То, что я пытаюсь сделать, это просто получить процент каждого «типа описания» в числовом виде, чтобы я мог позже заполнить диаграмму пончиков.
Спасибо
Комментарии:
1. используете ли вы entity Framework?
2. Вместо того, чтобы делать это CTE, я бы использовал вложенный запрос для получения сгруппированных значений и внешнего запроса для преобразования этого в процент. Это было бы проще перевести в Linq для сущностей, я даже не уверен, что можно перевести CTE.
3. Да, используя entity framework
4. @Igor это имеет смысл.
Ответ №1:
Я бы рекомендовал получить исходные данные из вашего хранилища данных, а затем вычислить проценты либо на уровне приложений, либо разрешить вашему компоненту диаграммы определять проценты на основе этого исходного значения. Что-то вроде этого должно работать:
var query = (from reason in dc.Reasons
join reject in dc.Rejections on reason.ReasonID equals reject.Reason
group reason by reason.Description into grouped
select new { Reason = grouped.Key, ItemCount = grouped.Count() })
.ToList();
// If you really need to generate the averages and not let your charting component figure the percentages out for you:
var totalItems = query.Sum(q => q.ItemCount);
var averages = query.Select(q => new { q.Reason, Average = q.ItemCount / totalItems * 100});
Если вы предпочитаете лямбды синтаксису запроса, загляните в GroupJoin .