В моем веб-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 (Транзакции)?
в каком году вы хотите годовой объем продаж для текущего?
saless !== salesПройдитесь по коду с помощью отладчика и проверьте свои значения. Не используйте подстроки, если в этом нет необходимости.





Вместо того, чтобы преобразовывать дату и время в строки, попробуйте получить к ним доступ как к целым числам. Вы можете сделать это с помощью .Month или .Year соответственно.
И в качестве примечания оба они возвращают int. В противном случае, если вы просто хотите изменить его достаточно для работы, замените «MM» на «yyyy» и замените salesDate.Substring(3, 2) на salesDate.Substring(6, 4)
Вы можете попытаться рассчитать диапазон дат 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);
}
Что собирается в функции суммы? Необходимо добавить переменную "Сумма"....
@hosseinsabziani -- нет. Это лучшее решение, так как оно самое быстрое. Нет смысла иметь значение суммы только для возврата. Таким образом, это решение использует наименьшее количество ресурсов.
@hosseinsabziani добавил ламбу для выбора суммы. Спасибо, что указали.
Я надеюсь, что следующий код будет работать для вас...
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?
во втором методе, который был прокомментирован, я использовал linq...
Именно моя точка зрения - если вы поместите это в первый оператор await linq, вам не нужен ToList(). ToList(), если он очень дорогой и не нужен.
Думал читабельность программы снизится. В остальном ты прав
Это linq - если кто-то не знает, что .sum() ему нужно изучить.
Весь метод можно заменить на return dbContext.Sales.Where(y => y.CreatedAt.Year == DateTime.Now.Year).Sum(x => x.Amount);, что значительно улучшает читабельность.
Как вы думаете, что делает
if (transactionMonth == salesMonth)