Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取日期期间查询中的最大版本_C#_Linq - Fatal编程技术网

C# 获取日期期间查询中的最大版本

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

我正在尝试编写一个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.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();