LINQ验证日期行及其值

时间:2017-09-14 09:40:33

标签: c# database linq

我的数据库中的数据如下所示:

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行。

1 个答案:

答案 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);