我的数据库中的数据如下所示:
2017-09-01 | values A
2017-09-01 | values B
我想知道哪个日期没有正确的数值。所以我在每天的日子之间都使用过这样的东西:
var days = Enumerable.Range(0, to.Subtract(from).Days + 1)
.Select(d => from.AddDays(d));
return days.ToDictionary(key => key,
value => metricsService.View(DbContext).Count(m => value.Equals(m.Date)) == recordsCountInOneDay);
工作正常,但现在我想确定哪条记录最旧(在连续的几天中),没有与给定条件不匹配的数据或数据。
基本上是这样的:
2017-09-01 | Correct value
2017-09-01 | Correct value
2017-09-02 | Correct value
2017-09-04 | Correct value
将返回2017-09-03
和
2017-09-01 | Correct value
2017-09-01 | Correct value
2017-09-02 | Wrong value
2017-09-04 | Correct value
将返回2017-09-02
。
我知道我可以用所有日子的简单for循环来做到这一点,但这很昂贵,因为我每天都有66条记录,我想检查数据约2年。
编辑:总结一下,我希望最旧的一天缺失或少于66行。
答案 0 :(得分:0)
我想你想要这样的东西,
IEnumerble<DateTimeOffset> DaySequence(source DateTimeOffset)
{
while (true)
{
yield return source;
source = source.AddDays(1.0D);
}
}
...
var from = //The start date of the comparison;
var source = metricsService.View(DbContext)
.Where(d => d.Date >= from) // everything after start
.GroupBy(d => d.Date) // group by Day
.OrderBy(g => g.Key); // order by Day
var earliestFail = DaySequence(from)
.Zip(
source,
(day, group) =>
new
{
day,
valid = day.Equals(group.Key) && group.Count = 66
})
.FirstOrDefault(a => !a.valid)
.Select(a => a.day);