LINQ 查询多个组和最新记录的计数 - Oracle DB

Posted

技术标签:

【中文标题】LINQ 查询多个组和最新记录的计数 - Oracle DB【英文标题】:LINQ Query Multiple Group and count of latest record - Oracle DB 【发布时间】:2021-12-03 22:26:03 【问题描述】:

我尝试将 Linq 查询分为 3 个(总计、成功、失败),但到目前为止“总计”Linq 查询工作正常。请帮我获取“成功”、“失败”列(它有多个状态,我们必须检查每个交易和目的地的最后一列) 注意:您需要按 ProcessTime、TransactionId、Destination 分组并检查最后一列是成功还是失败然后应用计数(我们使用 oracle 作为后端)

LINQ 用于总计数

 var query = (from filetrans in context.FILE_TRANSACTION
                             join route in context.FILE_ROUTE on filetrans.FILE_TRANID equals route.FILE_TRANID
                             where 
                                filetrans.PROCESS_STRT_TIME >= fromDateFilter && filetrans.PROCESS_STRT_TIME <= toDateFilter 
                             select new  PROCESS_STRT_TIME = DbFunctions.TruncateTime((DateTime)filetrans.PROCESS_STRT_TIME), filetrans.FILE_TRANID, route.DESTINATION ).
                             GroupBy(p => new  p.PROCESS_STRT_TIME, p.FILE_TRANID, p.DESTINATION );
                var result = query.GroupBy(x => x.Key.PROCESS_STRT_TIME).Select(x => new  x.Key, Count = x.Count() ).ToDictionary(a => a.Key, a => a.Count);

【问题讨论】:

发布 Total 的工作查询,以便我们可以将其用作模型来建议如何编写其他查询 您的FileStatus 表似乎有错误的列名?另外,表关系是什么?我看不出您的输出是如何从您的示例数据中得出的。 你不应该发帖duplicate questions。 我已经为@CaiusJard 添加了“Linq”查询 对不起。我的错。 Filestatue 表列是 FileStatusID 和 FileStatusName 。我删除了重复的问题@NetMage 【参考方案1】:

检查此解决方案。如果它给出了错误的结果,那么我需要更多的细节。

var fileTransQuery =
    from filetrans in context.AFRS_FILE_TRANSACTION
    where accountIds.Contains(filetrans.ACNT_ID) &&
      filetrans.PROCESS_STRT_TIME >= fromDateFilter && filetrans.PROCESS_STRT_TIME <= toDateFilter
    select filetrans;

var routesQuery =
    from filetrans in fileTransQuery
    join route in context.AFRS_FILE_ROUTE on filetrans.FILE_TRANID equals route.FILE_TRANID
    select route;

var lastRouteQuery = 
    from d in routesQuery.GroupBy(route => new  route.FILE_TRANID, route.DESTINATION )
        .Select(g => new 
        
            g.Key.FILE_TRANID, 
            g.Key.DESTINATION,
            ROUTE_ID = g.Max(x => x.ROUTE_ID)
        )
    from route in routesQuery
        .Where(route => d.FILE_TRANID == route.FILE_TRANID && d.DESTINATION == route.DESTINATION && d.ROUTE_ID == route.ROUTE_ID)
    select route;

var recordsQuery =
    from filetrans in fileTransQuery
    join route in lastRouteQuery on filetrans.FILE_TRANID equals route.FILE_TRANID
    select new  filetrans.PROCESS_STRT_TIME, route.CRNT_ROUTE_FILE_STATUS_ID ;

var result = recordsQuery
    .GroupBy(p => DbFunctions.TruncateTime((DateTime)p.PROCESS_STRT_TIME))
    .Select(g => new TrendData
    
        TotalCount = g.Sum(x => x.CRNT_ROUTE_FILE_STATUS_ID != 7 && x.CRNT_ROUTE_FILE_STATUS_ID != 8 ? 1 : 0)
        SucccessCount = g.Sum(x => x.CRNT_ROUTE_FILE_STATUS_ID == 7 ? 1 : 0),
        FailCount = g.Sum(x => failureStatus.Contains(x.CRNT_ROUTE_FILE_STATUS_ID) ? 1 : 0),
        Date = g.Min(x => x.PROCESS_STRT_TIME)
    )
    .OrderBy(x => x.Date)
    .ToList();   

【讨论】:

我已经编辑并添加了截图。请检查。谢谢 是的,我实际上忘记了这个 Oracle 的限制,因为新版本支持它。更正了有问题的部分。 太棒了!...它的工作。我将在不同的情况下更多地测试查询..非常感谢:) ..j 我还需要一个类似于上述查询的查询,但不需要 PROCESS_STRT_TIME 组。请检查我已编辑您的问题。 GroupBy(x =&gt; 1)

以上是关于LINQ 查询多个组和最新记录的计数 - Oracle DB的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Linq 查询获取多个表字段的计数

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

在 C# 中使用组和连接进行 LINQ 查询

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录

带有表连接、case 语句、计数、group by 子句的 Linq 查询

Linq 计数错误(列)