使用LINQ在LIST中列出最大和最小日期之间的缺失日期

时间:2016-12-22 15:20:59

标签: c# asp.net linq datetime range

我正在尝试填充我的列表,其中缺少日期,他们没有销售......

我已经定义了这样一个类:

   public class GroupedItem
    {
        public DateTime _Date { get; set; }
        public int Sales { get; set; }
    }

现在列表填充如下:

var LineGraph = _groupedItems
                      .GroupBy(l => l._Date.Date)
                      .Select(cl => new GroupedItem
                      {
                           _Date = cl.Key,
                           Sales = cl.Sum(c=>c.Sales)
                      })
                      .OrderBy(x => x._Date)
                      .Where(t => t._Date <= DateTime.Now &&
                      t._Date >= DateTime.Now.Subtract(TimeSpan.FromDays(date_range)))
                      .ToList();

我得到的输出如下:

11th December 6 sales
13th December 8 sales
18th December 12 sales
19th December 25 sales

这是相当好的,但我想在第一个和最后一个日期之间添加缺少的日期,以便我可以得到这样的输出:

11th December 6 sales
12th December 0 sales
13th December 8 sales
14th December 0 sales 
15th December 0 sales
16th December 0 sales
17th December 0 sales
18th December 12 sales
21st December 25 sales

如何使用LINQ实现此目的?

2 个答案:

答案 0 :(得分:4)

This Post可以根据范围生成日期列表。我认为我们必须将日期列表与您的分组查询联合起来,因为对我来说,您的查询结果还不包含0销售日期的行。

var LineGraph = _groupedItems.Union(Enumerable.Range(1, date_range)
          .Select(offset => new GroupedItem { _Date = DateTime.Now.AddDays(-(date_range)).AddDays(offset), Sales = 0} ))
                      .GroupBy(l => l._Date.Date)
                      .Select(cl => new GroupedItem
                      {
                           _Date = cl.Key,
                           Sales = cl.Sum(c=>c.Sales)
                      })
                      .Where(t => t._Date <= DateTime.Now &&
                      t._Date >= DateTime.Now.Subtract(TimeSpan.FromDays(date_range)))
                      .OrderBy(x => x._Date)
                      .ToList();

更正为今天包括,并在选择之后按顺序排列。

答案 1 :(得分:3)

您可以生成日期列表,并使用 img:hover div { display: block; var img = document.getElementById('imageid'); // get the image dimensions using this id var width1 = img.clientWidth; var height1 = img.clientHeight; height : width * 1.5; width : height * 1.5; } 进行左连接以生成整个列表:

lineGraph

使用此方法生成日期范围:

var minDate = lineGraph.Min(g => g.Date);
var maxDate = lineGraph.Max(g => g.Date);
var range = GetDateRange(minDate, maxDate);

var result = from date in range
             from item in lineGraph.Where(g => g.Date.Date == date)
                                   .DefaultIfEmpty()
             select new GroupedItem
             {
                 Date = date,
                 Sales = item?.Sales ?? 0
             };

或者,您可以这样做:

public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
{
    var date = startDate.Date;

    while (date <= endDate.Date)
    {
        yield return date;
        date = date.AddDays(1);
    }
}

并针对var min = _groupedItems.Min(g => g.Date); var max = _groupedItems.Max(g => g.Date); var range = GetDateRange(min, max).Select(d => new GroupedItem { Date = d, Sales = 0 }); 而不是range.Concat(_groupedItems)进行查询。