Переиспользование вычислений в linq2db
От: STDray http://stdray.livejournal.com
Дата: 22.08.18 16:05
Оценка:
Привет!


Есть, например, вот такой искусственный запрос
from cla in P2P_CALCULATED_CESSION_LOAN_ACCRUE
let cessionStartPlus2 = cla.CessionStart.AddDays(2)
let x = P2P_CALCULATED_CESSION_LOAN_ACCRUE.Sum(y => y.InvestorInterest)
select new
{
    Y1 = x < 0 ? 9 : x + 8,
    Y2 = Math.Round(x + x)
};


он раскрывается вот портянку, где вычисление x будет повторено несколько раз

SELECT
    CASE
        WHEN (
            SELECT
                Sum([t1].[InvestorInterest])
            FROM
                [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t1]
        ) < 0
            THEN 9
        ELSE (
            SELECT
                Sum([t1].[InvestorInterest])
            FROM
                [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t1]
        ) + 8
    END as [c2],
    (
        SELECT
            Sum([t2].[InvestorInterest])
        FROM
            [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t2]
    ) as [c4]
FROM
    [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t3]


Есть ли какой-то способ вместо прямой подстановки сгенерировать запрос с внешним select?
Что-то вроде такого
select 
    CASE WHEN t1.x < 0 THEN 9 ELSE t1.x + 8 END as [c2],
    Round(t1.x  + t1.x, 2) as [c4]
from (SELECT Sum([InvestorInterest]) as x FROM    [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE]) [t1]


Может как-то руками можно указать, что в данном случае надо x не раскрывать, а один раз вычислить и дальше оборачивать внещними селектами?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.