Выбор отличительного количества и суммы столбцов, полученных как подзапрос в Entity Framework - PullRequest
2 голосов
/ 10 мая 2019

Я хочу получить обобщенные данные для отчета, который показывает общую сумму и количество поставщиков в каждом решении в синтаксисе Framework организации. Мой результат должен был включать СУММУ Суммы и СЧЕТА общих поставщиков за решение.

У меня есть таблица поставщиков со следующими столбцами:

SupplierNo | Decision | DecisionIssuedOn | Amount | SupplierGroup | SubSupplier

Необработанный SQL-запрос для получения вышеуказанных данных за определенный период времени:

SELECT S.Decision, SUM(S.Amount) AS TotalAmount, COUNT(DISTINCT S.SupplierNo) AS SupplierCount
FROM (SELECT * FROM Indentors WHERE Indentors.DecisionIssuedOn BETWEEN '2018-01-01' AND '2018-12-31') S
GROUP BY S.Decision

Что дает данные как:

     SupplierCount | Amount 
     -----------------------
Approved     20 |  5000

Rejected     11 |  3000

In-Process   5  |  1500

Теперь из внешнего интерфейса параметры условия могут быть любыми из заданного пула параметров (раскрывающихся списков), которые при выборе добавляют выражение where в запросе на добавление, например

WHERE Decision = 'Approved' AND SupplierGroup ='ABC' AND SubSupplier ='zxc'

Проблема в том, что мне трудно получить желаемый результат, используя лямбда-выражения Entity Framework вместо необработанного SQL.

Что я сделал до сих пор:

Я проверил наличие опций из fornt-end для сборки where, как:

IQueryable<Supplier> suppliers = this.db.suppliers.OrderByDescending(i => i.Id);


            if (string.IsNullOrEmpty(selectedSupplierGroup) == false)
            {
                suppliers = suppliers.Where(i => i.SupplierGroup == selectedSupplierGroup);
            }

            if (string.IsNullOrEmpty(selectedSubSupplier) == false)
            {
                suppliers = suppliers.Where(i => i.SubSupplier == selectedSubSupplier);
            }
            if (string.IsNullOrEmpty(selectedDecision) == false)

            {
                suppliers = suppliers.Where(i => i.Decision == selectedDecision);
            }

            if (selectedDecisionIssuedOn.HasValue)

            {
                suppliers = suppliers.Where(i => i.DecisionIssuedOn >= selectedDecisionIssuedOn);
            }

              var result = suppliers
                        .GroupBy(i => i.Decision)
                        .Select(i => i.SupplierNo).Distinct().Count(); // Gives me error

Ошибка:

IGrouping не содержит определения для SupplierNo, и нет метода расширения бла-бла-бла-бла ...

Но после этого я не могу получить данные, поскольку необработанный запрос (описанный выше) получит меня. Спасибо

1 Ответ

1 голос
/ 10 мая 2019

Это должно дать вам результат, аналогичный вашему SQL-запросу. Попробуйте и посмотрите, как вы попали:

var results = suppliers
    .Where(i => i.DecisionIssuedOn >= selectedDecisionIssuedOn)
    .GroupBy(i => i.Decision)
    .Select(group => new
    {
        Decision = group.Key,
        TotalAmount = group.Sum(g => g.Amount),
        SupplierCount = group.Select(i => i.SupplierNo).Distinct().Count()
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...