Преобразование Oracle SQL в выражение LLBLGEN LINQ C# - PullRequest
0 голосов
/ 10 января 2020

У меня есть БД 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, мне нужно получить ВСЕ записи с последней версией ROW_LST_UPD_TS, сгруппированной по APP_ID

Я придумал oracle query:

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 Ответ

1 голос
/ 11 января 2020

Это только косвенно связано, поскольку это не решение вашей проблемы 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, где analyti c функции не были доступны.

Опять же, не решение, но больше, чем я мог разумно уместить в комментарии.

...