我正在尝试填充我的列表,其中缺少日期,他们没有销售......
我已经定义了这样一个类:
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实现此目的?
答案 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)
进行查询。