我在将sql转换为linq时遇到了问题,为了处理预期的结果。。。
考虑下表:
pkIdentifier fkProject fkFirst fkSecond Date
1 1030 1 1 03.08.2020 10:05:00
2 1030 1 2 03.08.2020 10:11:00
3 1030 3 1 03.08.2020 14:00:00
4 1030 3 2 03.08.2020 14:02:00
5 1040 1 1 03.08.2020 15:00:00
6 1050 2 1 04.08.2020 08:00:00
7 1050 2 2 04.08.2020 08:10:00
8 1050 2 3 04.08.2020 08:15:00
我在这里需要的是找到项目,与最大的“秒”-如果有更多的条目,然后与最年轻的日期之一。
也就是说,上表的结果是:
pkIdentifier fkProject fkFirst fkSecond Date
2 1030 1 2 03.08.2020 10:11:00
5 1040 1 1 03.08.2020 15:00:00
8 1050 2 3 04.08.2020 08:15:00
使用下面的sql,结果与我预期的几乎相同:
SELECT ps.fkProject, ps.fkFirst, ps.fkSecond, min(ps.Date) as Date
FROM ProjectsStatus ps
INNER JOIN (
SELECT a.fkProject, MAX(a.fkSecond) as maxSecond
FROM ProjectStatus a
GROUP BY a.fkProject
) b ON ps.fkProject = b.fkProject and ps.fkSecond = b.maxSecond
group by ps.fkProject, ps.First, ps.Second
我在linq上的尝试,但是如果有更多具有相同“fksecond”的条目,则仅缺少选择具有最年轻日期的条目:
var query = this.dataContext.ProjectStatus.Where(
x => x.fkSecond == this.dataContext.ProjectStatus.Where(y => y.fkProject == x.fkProject).Max(s => s.fkSecond)
);
我现在也得到了项目1030的第二行fksecond=2,但这不是我想要的。我只想要最年轻的那个,是2号。
pkIdentifier fkProject fkFirst fkSecond Date
2 1030 1 2 03.08.2020 10:11:00
4 1030 3 2 03.08.2020 14:02:00
5 1040 1 1 03.08.2020 15:00:00
8 1050 2 3 04.08.2020 08:15:00
2条答案
按热度按时间anhgbhbe1#
请参见以下内容:
nnsrf1az2#
您可以使用groupby,如下例所示:
groupby将按项目编号分组,然后按秒排序,然后按日期降序排列。然后取每组的第一个元素。