C# 获取日期期间查询中的最大版本
我正在尝试编写一个LINQ查询,该查询获取所有记录,并按C# 获取日期期间查询中的最大版本,c#,linq,C#,Linq,我正在尝试编写一个LINQ查询,该查询获取所有记录,并按期间对它们进行分组,即Sep-18,然后返回期间内具有最高版本编号的记录。例如,如果我的periodNames列表中包含三个句点,则输出列表应返回: 2018年9月 版本:1、2、3(返回版本为3的记录) 2018年10月 版本:1、2(返回版本为2的记录) 11月18日 版本:1、2、3、4(返回版本为4的记录) 这是我到目前为止写的问题: var previousStatements = _context.Statements.Wher
期间
对它们进行分组,即Sep-18
,然后返回期间内具有最高版本
编号的记录。例如,如果我的periodNames
列表中包含三个句点,则输出列表应返回:
2018年9月
版本:1、2、3(返回版本为3的记录)11月18日
版本:1、2、3、4(返回版本为4的记录)var previousStatements = _context.Statements.Where(x => periodNames.Contains(x.Period) &&
x.Version == _context.Statement.Max(y => y.Version)).toList();
我如何使其适应上述规范?谢谢您可以使用
GroupBy
对语句进行分组,并使用Max
查找最大值,例如
var previousStatements = _context.Statements.Where(x => periodNames.Contains(x.Period))
.GroupBy(x => x.Period)
.Select(x => new { Period = x.Key, MaxVersion = x.Max(y => y.Version))
.ToList();
以上代码仅返回句点和最大版本号。如果您需要每个期间版本号最高的记录,可以使用:
var previousStatements = (ctx.Items.Where(x => periodNames.Contains(x.Period))
.GroupBy(x => x.Period)
.ToArray())
.Select(x => x.OrderByDescending(y => y.Version).First())
.ToList();
请注意,上面的代码首先使用对
ToArray
的调用将GroupBy查询发送到数据库。然后从返回的组中,在内存中检索每个时段版本号最高的行 尝试使用GroupBy,然后使用orderbydescending作为最大版本:
_context.GroupBy(f => f.Period).Select(f=>f.OrderByDescending(r=>r.Version).First()).ToList();
我想如果你写了一个合适的需求,你就会知道你的解决方案了 你写道: …按时段(即9月18日)对其进行分组,然后返回时段内的最高版本号 您的示例不会返回最高版本号,而是返回具有最高版本号的行,因此我们假设这就是您想要的: 从一系列语句中,将这些语句分组为具有相等
周期的语句组,然后从每组返回具有最大版本号的语句
如果同一期间内的两条语句具有相同的版本号,则尚未定义所需的内容。让我们假设您认为这不会发生,所以您不关心在这种情况下返回哪一个
所以你有一系列的语句,其中每个语句都有一个句点和一个版本号
正式地说,你还没有定义Period
和VersionNumber
的类别,我们只知道你有一些代码可以决定两个Period
是否相等,你有一些东西可以决定哪个VersionNumber
更大
IEqualityComparer<Period> periodComparer = ...
IComparer<VersionNumber> versionComparer = ...
再次说明:如果可以使用默认比较器来确定两个时段何时相等以及哪个版本号更大,则无需添加比较器
SorBy的缺点是第三个和第四个元素etc也被排序,而您只需要第一个元素,即版本号最大的元素
这可以通过使用不太常用的:
这将把第一条语句作为newest语句(=到目前为止,这是版本号最高的语句)。第二个元素将放在下一个语句中。将对这两个语句进行比较,如果nextStatement的VersionNumber大于newest语句,则nextStatement将被视为较新的语句,因此将替换newest语句。聚合的结尾将返回newest语句您可以尝试使用GroupBy和OrderByDescending,然后使用第一个语句
var statements = _context.Statements
.Where(x => periodNames.Contains(x.Period))
.GroupBy(g => g.Period)
.Select(s => s.OrderByDescending(o => o.Version)
.FirstOrDefault()).ToList();
您可以按句点筛选,然后按版本降序并获取排序列表的第一项:var previousStatements=\u context.Statements.Where(x=>periodNames.Contains(x.Period)).ToList().OrderByDescending(x=>x.Version).FirstOrDefault代码>@ikerbara我想这只会返回一件物品。根据periodNames
列表中的句点数量,我需要多个句点。糟糕,我以为您只需要最高版本。您只需要最高版本号还是该句点中版本号最高的记录?@Markus版本号最高的记录
(period, statementsWithThisPeriod) => statementWithThisPeriod.Aggregate(
(newestStatement, nextStatement) =>
(versionComparer.Compare(newestStatement.VersionNumber, nextStatement.VersionNumber) >=0 ) ?
newestStatement :
nextStatement)
var statements = _context.Statements
.Where(x => periodNames.Contains(x.Period))
.GroupBy(g => g.Period)
.Select(s => s.OrderByDescending(o => o.Version)
.FirstOrDefault()).ToList();