Linq返回最大有效起始日期后的对象列表

时间:2017-10-27 11:25:07

标签: c# entity-framework linq

Hiiya,

因此,尝试根据从所选日期时间之前的日期开始的最大有效值来计算返回对象列表的查询。

原则示例

+----+--------------+------------+----------------+
| id | Employee_Num | Money_Owed | Effective_From |
+----+--------------+------------+----------------+
| 1  | 1            | 10.11      | 20/10/2017     |
+----+--------------+------------+----------------+
| 2  | 1            | 15.11      | 24/10/2017     |
+----+--------------+------------+----------------+
| 3  | 1            | 20.11      | 30/10/2017     |
+----+--------------+------------+----------------+
| 4  | 2            | 6.89       | 20/10/2017     |
+----+--------------+------------+----------------+
| 5  | 2            | 9.89       | 25/10/2017     |
+----+--------------+------------+----------------+
| 6  | 2            | 12.89      | 29/10/2017     |
+----+--------------+------------+----------------+

所以说我希望返回每个员工记录截至21/10/17我希望下面的内容将作为对象列表返回(实体)

+----+--------------+------------+----------------+
| id | Employee_Num | Money_Owed | Effective_From |
+----+--------------+------------+----------------+
| 1  | 1            | 10.11      | 20/10/2017     |
+----+--------------+------------+----------------+
| 4  | 2            | 6.89       | 20/10/2017     |
+----+--------------+------------+----------------+

然后截至2009年10月24日

+----+--------------+------------+----------------+
| id | Employee_Num | Money_Owed | Effective_From |
+----+--------------+------------+----------------+
| 2  | 1            | 15.11      | 24/10/2017     |
+----+--------------+------------+----------------+
| 4  | 2            | 6.89       | 20/10/2017     |
+----+--------------+------------+----------------+

我猜这个查询应该是这样的,但是不能解决它应该是什么。

 var qry = from t in db.Entity.Where(x => x.Effective_From <= as_of_date)
     .OrderBy(x => x.Employee_Num)
     select new Entity { *need rest of entity fields* ,effective_from = Max(e => e.Effective_From) };

任何有助于完成或指向不同方向的帮助都将受到赞赏......

1 个答案:

答案 0 :(得分:3)

我相信您要做的事情将涉及GroupBy表达式按员工编号分组,按员工编号排序,然后从降序生效,然后采用第一个可用组合。

var qry = db.Entity.Where(x => x.Effective_From <= as_of_date)
   .OrderBy(x => x.Employee_Num)
   .ThenByDescending(x => X.Effective_From)
   .GroupBy(x => x.Employee_Num)
   .Select(g => g.FirstOrDefault())
   .ToList();

这是您想要的实际实体。我会避免为实体执行类似“select new”的操作,因为这将包含相关实体的数据,就上下文而言,它们不是相同的引用。 .Select()将用于检索适合某些逻辑的匿名类型,或者为前端填充视图模型,或者为API结果填充DTO。