Как получить общий годовой объем продаж

В моем веб-API ASP.NET Core 6 я использовал приведенный ниже код для расчета общего годового объема продаж (от Transactions):

private async Task<decimal> GetAllTotalMonthlyTransactions()
{
    string transactionMonth = DateTime.Now.ToString("MM");
    decimal totalMonthlyTransactions = 0;

    var sales = await _dbContext.Sales.ToListAsync();

    foreach (var item in sales)
    {
        var salesDate = item.CreatedAt.ToString();
        var salesMonth = salesDate.Substring(3, 2);

        if (transactionMonth == salesMonth)
        {
            totalMonthlyTransactions += item.Amount;
        }
    }

    return totalMonthlyTransactions;
}

Как переписать приведенный выше код, чтобы получить TotalAnnualSales (Транзакции)?

Как вы думаете, что делает if (transactionMonth == salesMonth)

BurnsBA 03.10.2022 23:26

в каком году вы хотите годовой объем продаж для текущего?

Hogan 03.10.2022 23:30
saless !== sales
Heretic Monkey 03.10.2022 23:35

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

Heretic Monkey 03.10.2022 23:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
180
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

И в качестве примечания оба они возвращают int. В противном случае, если вы просто хотите изменить его достаточно для работы, замените «MM» на «yyyy» и замените salesDate.Substring(3, 2) на salesDate.Substring(6, 4)

Brandon 03.10.2022 23:37

Вы можете попытаться рассчитать диапазон дат from и to на основе указанного месяца, а затем запросить/отфильтровать данные о продажах с этим диапазоном дат from и to, как показано ниже.

var date1 = DateTime.Now;
var days = DateTime.DaysInMonth(date1.Year, date1.Month);

var from = new DateTime(date1.Year, date1.Month, 1, 0, 0, 0);
var to = new DateTime(date1.Year, date1.Month, days, 23, 59, 59);          

var totalMonthlyTransactions = sales.AsEnumerable().Where(s => s.CreatedAt >= from && s.CreatedAt <= to).Select(s => s.Amount).Sum();
        
private async Task<decimal> GetAllTotalMonthlyTransactions()
{
    int currentYear  = DateTime.Now.Year;

    return (await dbContext.Sales.Where(t=>t.CreatedAt.Year==currentYear).ToListAsync()).Sum(item=>item.Amount);

}

Что собирается в функции суммы? Необходимо добавить переменную "Сумма"....

Hossein Sabziani 04.10.2022 10:22

@hosseinsabziani -- нет. Это лучшее решение, так как оно самое быстрое. Нет смысла иметь значение суммы только для возврата. Таким образом, это решение использует наименьшее количество ресурсов.

Hogan 04.10.2022 14:31

@hosseinsabziani добавил ламбу для выбора суммы. Спасибо, что указали.

Mayur Ekbote 05.10.2022 08:49

Я надеюсь, что следующий код будет работать для вас...

private async Task<IEnumerable<object>> GetMonthlyTransactions(int year)
    {
        var starting = new DateTime(year, 1, 1).Date;
        var sales = await context.Sales.Where(f => f.SalesDate >= starting).Select(s => new
        {
            Date = s.SalesDate.ToString("MM-yyyy"),
            Amount = s.NetAmount
        }).ToListAsync();
        var finaldata = sales.GroupBy(s => s.Date, (d, a) => new { Date = d, Am = a }).Select(l => new
        {
            Date = l.Date,
            Amount = l.Am.Sum(h => h.Amount)
        });
        return finaldata;
       
    }
Ответ принят как подходящий
private async Task<decimal> GetAllTotalMonthlyTransactions()
{
    decimal totalAnnualTransactions = 0;

    int _year  = DateTime.Now.Year;    
    var sales = await dbContext.Sales.Where(y=>y.CreatedAt.Year==_year).ToListAsync();

    // The first method
    foreach (var item in sales)
    {
         totalAnnualTransactions += item.Amount;
    }

    // The second method
    //double totalAnnualTransactions= sales.Sum(item => item.Amount);

    return totalAnnualTransactions;
}

вы используете linq, почему бы не сделать сумму в операторе linq?

Hogan 04.10.2022 14:29

во втором методе, который был прокомментирован, я использовал linq...

Hossein Sabziani 04.10.2022 14:31

Именно моя точка зрения - если вы поместите это в первый оператор await linq, вам не нужен ToList(). ToList(), если он очень дорогой и не нужен.

Hogan 04.10.2022 14:33

Думал читабельность программы снизится. В остальном ты прав

Hossein Sabziani 04.10.2022 14:35

Это linq - если кто-то не знает, что .sum() ему нужно изучить.

Hogan 04.10.2022 14:37

Весь метод можно заменить на return dbContext.Sales.Where(y => y.CreatedAt.Year == DateTime.Now.Year).Sum(x => x.Amount);, что значительно улучшает читабельность.

BurnsBA 04.10.2022 15:14

Другие вопросы по теме