Как обеспечить добавление 4 значений для каждого идентификатора - PullRequest
0 голосов
/ 19 сентября 2019

Я играю с "неделями".Я извлекаю данные из БД следующим образом:

enter image description here

Мой объект в c # выглядит так:

public class DemoObj
{
 public decimal Amount { get; set; }
 public int Month { get; set; }
 public int Week { get; set; }
}

Я группирую данные, как я написал справа на изображении, и это прекрасно работает, и в конце это выглядит так:

Month 6
Week 2

Month 8
Week 2

Month 8
Week 3

Но я бы хотел добиться следующего:

Проверьте, не существует ли всех 4 недель в одном месяце, например, для месяца со значением 8, давайте добавим отсутствующие недели, даже если это будет пустой объект, будет заполнено значение недели заполнения, поэтому конечное значение будет выглядеть следующим образом:

 Month 8
 Week 1

 Month 8
 Week 2

 Month 8
 Week 3

 Month 8
 Week 4

Итак, проверьте, есть ли не все 4 недели для значения 8, если нет, то давайте добавим отсутствующие ..

Вот мой текущий код:

var query = await _context.product
                     .AsNoTracking()
                     .Where(x => (x.PaymentDate != null && x.PaymentDate > DateTime.UtcNow.AddMonths(-4))).ToListAsync();


var groupedData = query.GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.PaymentDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday))
    .Select(product => new productsChartDTO
    {
        Week = GetWeekNumberOfMonth(product.FirstOrDefault().PaymentDate.Value),
        Amount = product.Sum(x => x.Amount),
        Month = product.FirstOrDefault().PaymentDate.Value.Month
    });

Таким образом, только для возвращаемых месяцев, если не все 4 недели (значения с 1,2,3,4), давайте найдем, какие из них отсутствуют, и добавим что-то подобное.

Любой видпомощи было бы здорово

Спасибо

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Вы можете сгруппировать по месяцам, а затем создать productsChartDTO[4] с записью для каждой недели:

var groupedData = query.GroupBy(x => (x.PaymentDate ?? DateTime.UtcNow).Month)
    .Select(month =>
    {
        var weeks = Enumerable.Range(1, 4).Select(x => new productsChartDTO() { Month = month.Key, Week = x, Amount = 0 }).ToArray();
        foreach (var date in month)
        {
            int week = GetWeekNumberOfMonth(date.PaymentDate ?? DateTime.UtcNow);
            weeks[week - 1].Amount += date.Amount;
        }
        return weeks;
    })
    .SelectMany(x => x);
0 голосов
/ 19 сентября 2019

Может быть какой-то более чистый способ сделать это, но это работает.

    static void Main(string[] args)
    {
        var groupedData = new List<DemoObj>
            {
                new DemoObj { Amount = 11, Month = 1, Week = 1 },
                new DemoObj { Amount = 133, Month = 1, Week = 2 },
                new DemoObj { Amount = 323, Month = 1, Week = 3 },
                // Needs to add week 4
                new DemoObj { Amount = 2342, Month = 2, Week = 1 },
                // Needst to add week 2
                new DemoObj { Amount = 23433, Month = 2, Week = 3 }
                // Needs to add etc.. 
            };

        var fullData = AddMissingValues(groupedData);
    }

    private static IEnumerable<DemoObj> AddMissingValues(IEnumerable<DemoObj> valuesFromDb)
    {
        var results = valuesFromDb.ToList();
        var possibleMonths = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
        var possibleWeeks = new[] { 1, 2, 3, 4 };

        foreach (var possibleMonth in possibleMonths)
        {
            foreach (var possibleWeek in possibleWeeks)
            {
                if (results.Any(x => x.Month == possibleMonth && x.Week == possibleWeek) == false)
                {
                    results.Add(new DemoObj { Month = possibleMonth, Week = possibleWeek });
                }
            }
        }

        return results.OrderBy(x => x.Month).ThenBy(x => x.Week);
    }

    public class DemoObj
    {
        public decimal Amount { get; set; }
        public int Month { get; set; }
        public int Week { get; set; }
    }
...