ASP .Netcore MVC - Razor Отображение итоговых расходов по категориям по строкам Месяц / Год и общих расходов за месяц с использованием efcore - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь создать таблицу, подобную приведенной ниже, с заказами, сгруппированными по месяцам, и соответствующие категории, в которые попадают заказы, соответственно подсчитываются

Я также смог либо сортируйте по месяцам / годам и получайте общий итог, либо сортируйте по категориям и получайте итоговые суммы для этой категории, но не можете понять, как их объединить.

это создает действие, разрешающее группу месяца

    public async Task<IActionResult> ExpensesPaymentList()
    {

        var model = _context.Requests.Include(r => r.Product)
            .ThenInclude(r => r.ProductSubcategory)
            .ThenInclude(r => r.ParentCategory)
            .GroupBy(r => new
            {
                Month = r.ParentRequest.OrderDate.Month,
                Year = r.ParentRequest.OrderDate.Year,
            })

            .Select(g => new MonthlyTotalsViewModel
            {
                Month = g.Key.Month,
                Year = g.Key.Year,
                GrandTotal = g.Sum(r => r.Cost)
            })
            .OrderByDescending(a => a.Year)
            .ThenByDescending(a => a.Month)
            .ToList();

        return View(await model.ToListAsync());
    }

это создает действие, допускающее для группы категорий

    public ActionResult ExpensesPaymentList()
    {
        var model = _context.Requests.Include(r => r.Product)
            .ThenInclude(r => r.ProductSubcategory)
            .ThenInclude(r => r.ParentCategory)
            .AsEnumerable()
            .GroupBy(r => new
            {
                ParentCategory = r.Product.ProductSubcategory.ParentCategory,
            })
            .Select(g => new ExpensesPaymentListViewModel
            {
                ParentCategory = g.Key.ParentCategory,
                Total = g.Sum(r => r.Cost)
            })
            .ToList();

        return View(model);
    }

Мои viewModels:

public class ExpensesPaymentListViewModel
{
    public ParentCategory ParentCategory { get; set; }
    public double Total { get; set; }
}
public class MonthlyTotalsViewModel
{
    public int Month { get; set; }
    public int Year { get; set; }
    public double GrandTotal { get; set; }
}

Я открыт для любых предложений или попробовать что-то совершенно новое - я был застрял на этом в течение нескольких дней. спасибо!

edit: Я также пытался использовать где в select и жестко кодировать различные категории и привязывать их к viewModel, но Linq говорит, что это недопустимый запрос. Смотри ниже

    public async Task<IActionResult> ExpensesPaymentList()
    {

        var model = _context.Requests.Include(r => r.Product)
            .ThenInclude(r => r.ProductSubcategory)
            .ThenInclude(r => r.ParentCategory)
            .GroupBy(r => new
            {
                Month = r.ParentRequest.OrderDate.Month,
                Year = r.ParentRequest.OrderDate.Year,
            })

            .Select(g => new MonthlyTotalsViewModel
            {
                Month = g.Key.Month,
                Year = g.Key.Year,
                PlasticsTotal = g.Where(g => g.Product.ProductSubcategory.ParentCategory.ParentCategoryID == 1).Sum(r => r.Cost),
                ReagentsTotal = g.Where(g => g.Product.ProductSubcategory.ParentCategory.ParentCategoryID == 2).Sum(r => r.Cost), 
                  //and so on for the rest of my parentcategories
                GrandTotal = g.Sum(r => r.Cost)
            })
            .OrderByDescending(a => a.Year)
            .ThenByDescending(a => a.Month)
            .ToList();

        return View(await model.ToListAsync());
    }

1 Ответ

0 голосов
/ 01 апреля 2020

Это не та же логика c, но она должна решить проблему. На выходе получается именно то, что должно быть

Модель:

public class MonthlyTotalsModel
    {

        public int Month { get; set; }
        public int Year { get; set; }
        public double GrandTotal { get; set; }
        public double PlasticsTotal { get; set; }
        public double ReagentsTotal { get; set; }
        public double ProprietyTotal { get; set; }
        public double ReusableTotal { get; set; }

    }

ViewModel

    public class ExpensesListViewModel
    {
        public List<MonthlyTotalsViewModel> monthlyTotals { get; set; }
    } 

Контроллер

public async Task<IActionResult> ExpensesList()
    {
        List<MonthlyTotalsViewModel> monthlyTotals = new List<MonthlyTotalsViewModel>();

        var requestsByMonthAndYear = _context.Requests.Select(r => new { Year = r.ParentRequest.OrderDate.Year, Month = r.ParentRequest.OrderDate.Month }).Distinct();
        foreach (var req in requestsByMonthAndYear)
        {
            var requestsinMonthAndYear = _context.Requests.Include(r => r.ParentRequest).Include(r => r.Product).ThenInclude(p => p.ProductSubcategory).ThenInclude(p => p.ParentCategory).Where(r => r.ParentRequest.OrderDate.Year == req.Year).Where(r => r.ParentRequest.OrderDate.Month == req.Month).ToList();
            MonthlyTotalsViewModel monthlyTotalsViewModel = new MonthlyTotalsViewModel
            {
                Month = req.Month,
                Year = req.Year,
                GrandTotal = requestsinMonthAndYear.Sum(r => r.Cost),
                PlasticsTotal = requestsinMonthAndYear.Where(r => r.Product.ProductSubcategory.ParentCategoryID == 1).AsEnumerable().Sum(m => m.Cost),
                ReagentsTotal = requestsinMonthAndYear.Where(r => r.Product.ProductSubcategory.ParentCategoryID == 2).AsEnumerable().Sum(m => m.Cost),
                ProprietyTotal = requestsinMonthAndYear.Where(r => r.Product.ProductSubcategory.ParentCategoryID == 3).AsEnumerable().Sum(m => m.Cost),
                ReusableTotal = requestsinMonthAndYear.Where(r => r.Product.ProductSubcategory.ParentCategoryID == 4).AsEnumerable().Sum(m => m.Cost)
            }
            monthlyTotals.Add(monthlyTotalsViewModel);
        }

        ExpensesListViewModel expensesListViewModel = new ExpensesListViewModel
        {
            monthlyTotals = monthlyTotals
        };

        return View(expensesListViewModel);
    }

Просмотр

@model PrototypeWithAuth.ViewModels.ExpensesListViewModel
@{
    ViewData["Title"] = "ExpensesList";
    Layout = "~/Views/Shared/PaymentView.cshtml";
}

<h1>ExpensesList</h1>

<table class="table table-bordered">
<tr>
    <th>
        Month - Year
    </th>
    <th>
        Plastics
    </th>
    <th>
        Reagents
    </th>
    <th>
        Proprietry
    </th>
    <th>
        Reusable
    </th>
</tr>
@foreach(var item in Model.monthlyTotals)
{
    <tr>
        <td>
            @item.Month - @item.Year
        </td>
        <td>
            @item.PlasticsTotal
        </td>
        <td>
            @item.ReagentsTotal
        </td>
        <td>
            @item.ProprietyTotal
        </td>
        <td>
            @item.ReusableTotal
        </td>
    </tr>
}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...