将 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#的主要内容,如果未能解决你的问题,请参考以下文章