簡體   English   中英

LINQ 查詢多個組和最新記錄的計數 - Oracle DB

[英]LINQ Query Multiple Group and count of latest record - Oracle DB

請檢查表設計

我試圖將 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);

現在我認為沒有必要讓它太復雜; 我不會費心將另一個表加入連接,然后查看事務 ID 的末尾以在事物的 DB 端找到“成功”或“失敗”一詞(尤其是因為它們有拼寫錯誤)。 您所有的狀態 ID 都很好,即使成功也很奇怪,但我會全部下載它們,分組:

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),
        STAT = route.FILE_STATUS_ID < 7 ? route.FILE_STATUS_ID % 2 : 2
      }
  ).GroupBy(p => p) 
  .ToDictionary(g => g.Key, g => g.Count());

您最終的 STAT 為 0 表示成功,1 表示失敗或 2 表示已完成

如果你想要總數,只需在本地 Sum()

檢查此解決方案。 如果它給出錯誤的結果,那么我需要更多的細節。

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.Select(route => new { route.FILE_TRANID, route.DESTINATION }).Distinct()
    from route in routesQuery
        .Where(route => d.FILE_TRANID == route.FILE_TRANID && d.DESTINATION == route.DESTINATION)
        .OrderByDescending(route => route.ROUTE_ID)
        .Take(1)
    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();   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM