【问题标题】:LINQ verify row of dates and their valuesLINQ 验证日期行及其值
【发布时间】:2017-09-14 18:11:01
【问题描述】:

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

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 行的最早的一天。

【问题讨论】:

  • 那么,如果你在同一天有正确的值和错误的值呢?
  • 实际上一天有66条记录,如果没有,我认为这是不正确的值。因此,DbContext.Metrics.Where(x => x.Date.Equals(checkeddate)).Count() == correctCount 将返回 true 如果值存在则返回 false 如果不存在。
  • 所以您想要丢失或少于 66 行的最旧日期?
  • 是的,这正是我的意思。
  • for循环的效率不比linq差。 Linq 甚至可能更糟。使用易于理解和调试的代码。不要创建复杂的 linq 语句,当您在 6 个月后查看它时需要数小时才能更改。

标签: c# database linq


【解决方案1】:

我想你想要这样的东西,

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

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多