【问题标题】:Querying one record of each type between dates查询日期之间每种类型的一条记录
【发布时间】:2019-09-05 17:20:09
【问题描述】:

我有一张这样的桌子(出席)

+----+--------------------------+-------+------------+
| id |         employeeId       | type  |    date    |
+----+--------------------------+-------+------------+
|  0 | alberto                  |  A    | 2019-10-01 |
|  1 | alberto                  |  A    | 2019-10-02 |
|  2 | alberto                  |  A    | 2019-10-03 |
|  3 | pedro                    |  B    | 2019-10-01 |
|  4 | pedro                    |  B    | 2019-10-02 |
|  5 | pedro                    |  B    | 2019-10-03 |
|  6 | juan                     |  A    | 2019-10-01 |
|  7 | juan                     |  A    | 2019-10-02 |
|  8 | oscar                    |  A    | 2019-10-01 |
|  9 | marcelo                  |  B    | 2019-10-01 |
| 10 | marcelo                  |  B    | 2019-10-02 |
| 11 | marcelo                  |  B    | 2019-10-03 |
+----+--------------------------+-------+------------+

使用 LINQ 表达式并给定日期范围,例如 2019-10-01 到 2019-10-03,我想找到每种类型的第一个employeeId,它在范围之间的每个日期都有记录2019-10-01 的记录,2019-10-02 的另一个记录和 2019-10-03 的另一个记录,所以结果应该是

alberto   |    typeA
pedro     |    TypeB 

到目前为止,我有这个:

_context.Attendance
     .Where(s => s.Date>= sm.InitialDate && s.Fecha <= sm.FinalDate)

我尝试了一些方法,但我无法成功。

【问题讨论】:

    标签: c# linq ef-core-2.2


    【解决方案1】:

    你已经有了一个好的开始,在过滤掉日期范围之外的元素后,你应该按类型分组,然后得到每个组中的第一个:

    var list = _context.Attendance
        .Where(s => s.Date>= sm.InitialDate && s.Fecha <= sm.FinalDate)
        .GroupBy(x => x.Type)
        .Select(x => x.First())
        .Select(x => new { x.EmployeeId, x.Type })
        .ToList();
    

    【讨论】:

    • 谢谢,但我如何确保范围日期的每一天都存在一条记录?
    • @albertolo 这与您的问题有什么关系?
    • 我可能没有在问题中包含,我把它放在桌子后面的细节上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多