Лучшая практика для суммы атрибута в нескольких репозиториях - PullRequest
0 голосов
/ 02 октября 2019

У меня есть несколько репозиториев, которые содержат userId, paidDate и такие атрибуты суммы, как Bills(userId, paidDate, amount) Shoppings(userId, paidDate, amount) и т. Д. Я хочу получить сумму сумм, сгруппировать их по userId и получить что-то вроде {user1: {amount1, amount2, amount3 ..}, user2: {amount4, ..}}

Я создал модель CostDetails, которая содержит все вышеперечисленные репозитории.

public class ExpenseDetails
{
    public IEnumerable<ApplicationUser> ApplicationUsers { get; set; }
    public IEnumerable<Bill> Bills { get; set; }
    public IEnumerable<Shopping> Shoppings { get; set; }
    public IEnumerable<Rent> Rents { get; set; }
}

И я создал вспомогательный метод для расчета суммы сумм с циклом каждой модели в CostDetails.

public static Dictionary<string, List<double>> UsersExpense(ExpenseDetails expenseDetails)
    {
        Dictionary<string, List<double>> TotalCosts = new Dictionary<string, List<double>>();
        List<double> Total = new List<double>();
        double sum = 0;

        foreach (var user in expenseDetails.ApplicationUsers)
        {
            foreach (var item in expenseDetails.Shoppings)
            {
                if (item.ApplicationUserId == user.Id)
                {
                    if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
                    {
                        sum = item.Amount + sum;
                    }
                }
            }

            Total.Add(sum);
            sum = 0;

            foreach (var item in expenseDetails.Bills)
            {
                if (item.ApplicationUserId == user.Id)
                {
                    if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
                    {
                        sum = item.Amount + sum;
                    }
                }
            }

            Total.Add(sum);
            sum = 0;

            foreach (var item in expenseDetails.Rents)
            {
                if (item.ApplicationUserId == user.Id)
                {
                    if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
                    {
                        sum = item.Amount + sum;
                    }
                }
            }

            Total.Add(sum);
            sum = 0;

            TotalCosts.Add(user.Id, Total.ToList());
            Total.Clear();
        }

        return TotalCosts;
    }

Ноэто не очень хорошо для программирования. Как я могу достичь этого с лучшей практикой? Кстати, я использую шаблон хранилища.

1 Ответ

0 голосов
/ 03 октября 2019

Для полной демонстрации, чтобы достичь ваших требований:

var result = expenseDetails.ApplicationUsers.Select(a => new
{
    a.Id,
    BillAmountCount = expenseDetails.Bills.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
    ShoppingAmountCount = expenseDetails.Shoppings.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
    RentCount = expenseDetails.Rents.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
}).ToList().ToDictionary(a => a.Id, a => new List<double>{ a.BillAmountCount, a.ShoppingAmountCount, a.RentCount});
...