将 Oracle SQL 转换为 LLBLGEN LINQ 表达式 C#

Posted

技术标签:

【中文标题】将 Oracle SQL 转换为 LLBLGEN LINQ 表达式 C#【英文标题】:Converting Oracle SQL to LLBLGEN LINQ expression C# 【发布时间】:2020-04-27 18:31:13 【问题描述】:

我有一个包含 1 个表的数据库:

APP_ID|SETTING_NAME|SETTING_VALUE|ROW_LST_UPD_TS
1     |ab1         |111          |17:32 
1     |ab2         |112          |17:32
--------------------------------------- 
1     |ab1         |111          |14:31 
1     |ab2         |112          |14:31 
---------------------------------------
2     |ba1         |121          |18:44 
2     |ba2         |122          |18:44
--------------------------------------- 
2     |ba1         |121          |15:27 
2     |ba2         |122          |15:27
--------------------------------------- 

使用 llblgen pro 和 LinqMetaAdapter 我需要获取按 APP_ID 分组的最新 ROW_LST_UPD_TS 的所有记录

我想出了 oracle 查询:

SELECT distinct 
    configurationLog.SETTING_NAME, 
    configurationLog.SETTING_VALUE, 
    configurationLog.ROW_LST_UPD_TS, 
    configurationLog.ROW_LST_UPD_UID, 
    configurationLog.APP_ID
FROM 
    EVENT_MGT.CONFIGURATION_LOG configurationLog
INNER JOIN
(
    SELECT APP_ID, MAX(ROW_LST_UPD_TS) maxTimestamp 
    FROM EVENT_MGT.CONFIGURATION_LOG
    GROUP BY APP_ID
) latestSettingPerApp
ON 
    latestSettingPerApp.maxTimestamp <= configurationLog.ROW_LST_UPD_TS 
    and latestSettingPerApp.maxTimestamp >= configurationLog.ROW_LST_UPD_TS - 1/1440  
    and latestSettingPerApp.APP_ID = configurationLog.APP_ID
ORDER BY 
    configurationLog.APP_ID;

但无法将其转换为 LINQ

【问题讨论】:

【参考方案1】:

这只是间接相关,因为它不是您的 LINQ 问题的解决方案,但我认为使用窗口函数编写您的查询要好得多。我认为它更易于阅读和维护,并且对于大型数据集可能会更高效。

with max_vals as (
  SELECT
    SETTING_NAME, 
    SETTING_VALUE, 
    ROW_LST_UPD_TS, 
    ROW_LST_UPD_UID, 
    APP_ID,
    max (ROW_LST_UPD_TS) over (partition by app_id) as max_ts
  FROM 
    EVENT_MGT.CONFIGURATION_LOG configurationLog
)
select
  SETTING_NAME, SETTING_VALUE, ROW_LST_UPD_TS, ROW_LST_UPD_UID, APP_ID
from max_vals
where
  ROW_LST_UPD_TS = max_tx
order by
  APP_ID

您使用的构造看起来就像您在分析功能不可用的 DMBS 中所做的那样。

同样,这不是一个解决方案,但超出了我在评论中的合理范围。

【讨论】:

以上是关于将 Oracle SQL 转换为 LLBLGEN LINQ 表达式 C#的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 转换为 Oracle 设置参数 [重复]

将 Oracle 外连接转换为 SQL Server

将 T-SQL 交叉应用转换为 Oracle

从 Oracle 转换为 SQL Server

Oracle SQL - 将选择计数(*)转换为零或一

将 oracle sql 时间戳转换为 char Coldfusion