C# 使用LINQ在列表中的最大日期和最小日期之间向列表添加缺少的日期

C# 使用LINQ在列表中的最大日期和最小日期之间向列表添加缺少的日期,c#,asp.net,linq,datetime,range,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)

我试图在我的列表中填入他们没有销售的缺失日期

我定义了这样一个类:

   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
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
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 });
现在,列表的填充方式如下所示:

   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
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
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 });
这很好,但是我想添加第一个和最后一个日期之间缺少的日期,这样我就可以得到如下输出:

   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
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
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 });
如何使用LINQ实现这一点?

有一种基于范围生成日期列表的方法。我认为我们必须将日期列表合并到groupedquery中,因为在我看来,您的查询结果中似乎还没有包含销售为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();
var LineGraph=\u groupedItems.Union(可枚举的.Range(1,日期范围)
.Select(offset=>newgroupeditem{{{u Date=DateTime.Now.AddDays(-(日期范围)).AddDays(offset),Sales=0}))
.GroupBy(l=>l._Date.Date)
.选择(cl=>new GroupedItem
{
_日期=cl.键,
销售额=总销售额(c=>c销售额)
})
.Where(t=>t.。\u Date=DateTime.Now.Subtract(TimeSpan.FromDays(Date\u range)))
.OrderBy(x=>x.\u日期)
.ToList();
已更正为在选择后包含“今天”和“订单依据”。

有一种基于范围生成日期列表的方法。我认为我们必须将日期列表合并到groupedquery中,因为在我看来,您的查询结果中似乎还没有包含销售为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();
var LineGraph=\u groupedItems.Union(可枚举的.Range(1,日期范围)
.Select(offset=>newgroupeditem{{{u Date=DateTime.Now.AddDays(-(日期范围)).AddDays(offset),Sales=0}))
.GroupBy(l=>l._Date.Date)
.选择(cl=>new GroupedItem
{
_日期=cl.键,
销售额=总销售额(c=>c销售额)
})
.Where(t=>t.。\u Date=DateTime.Now.Subtract(TimeSpan.FromDays(Date\u range)))
.OrderBy(x=>x.\u日期)
.ToList();

已更正为在选择后包含“今天”和“订单依据”。

您可以生成日期列表,并与
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);
    }
}

并对
range.Concat(\u groupedItems)
进行查询,而不是
\u groupedItems
您可以生成日期列表,并与
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);
    }
}


并对
range.Concat(\u groupedItems)
进行查询,而不是
\u groupedItems

我的大脑很难不想只拥有一个日期范围内的日期列表,而你一直在加入。真的刚刚加入?我如何在LINQ中做到这一点,我以前从未这样做过。我正在使用LinqPad开发一个解决方案,请抓紧。它要么是左加入,要么是联合。@EJC好的,非常感谢!:)我的大脑正经历一段艰难的时光,不想仅仅拥有一个你留下来加入的日期范围内的日期列表。真的只是留下来加入吗?我如何在LINQ中做到这一点,我以前从未这样做过。我正在使用LinqPad开发一个解决方案,请抓紧。它要么是左加入,要么是联合。@EJC好的,非常感谢!:)你想包括今天吗?我把订单移到了应该有助于订购的位置之后。我还将查询更正为包含“今天”。数据列表问题:它没有包含您想要的所有日期?点菜:嗯,在这之后还有别的点菜吗?当我
.Dump()时它在LinqPad中的顺序是正确的。我发现问题不在于你所做的升级,而在于我转换日期格式的视图本身。是的,你的升级工作非常出色,我刚刚接受了你的答案。快乐编码和快乐新年伴侣:)你想包括今天吗?我把订单移到了应该有助于订购的地方。我还将查询更正为包含“今天”。数据列表问题:它没有包含您想要的所有日期?点菜:嗯,在这之后还有别的点菜吗?当我
.Dump()时它在LinqPad中的顺序是正确的。我发现问题不在于你所做的升级,而在于我转换日期格式的视图本身。是的,你的升级工作非常出色,我刚刚接受了你的答案。快乐的编码和快乐的新年伴侣:)如果日期范围变为过去的1个月,这会起作用吗?例如:12月22日至11月23日?@User987:使用
左连接
联系人
解决方案,在这两种情况下,日期的范围都是从最早的日期到出现在
\u groupedItems
中的最晚日期,而不管
范围\u date
值如何。如果日期范围变为过去1个月,这是否有效?例如:12月22日至11月23日?@User987:使用
左连接
联系人
解决方案,在这两种情况下,日期的范围都是从最早的日期到出现在
\u groupedItems
中的最晚日期,而不考虑
范围\u日期
值。