Я пытаюсь реализовать следующий запрос в LINQ
SELECT [flh].[InterestRate], [fld].[RegularPaymentAmount]
FROM [FactLoanDetail] AS [fld]
INNER JOIN [FactLoanHistory] AS [flh] ON [fld].[LoanKey] = [flh].[LoanKey]
LEFT OUTER JOIN [FactLoanPayment] AS [flp] ON ([flh].[LoanKey] = [flp].[LoanKey])
AND flp.PostedDateKey = ( SELECT MAX(PostedDateKey) FROM FactLoanPayment
WHERE LoanKey = flh.LoanKey )
AND flp.PaymentSequenceNumber = ( SELECT MAX(PaymentSequenceNumber)
FROM FactLoanPayment WHERE LoanKey = flh.LoanKey )
WHERE [flh].[AsOfDateKey] = 20200415;
Это для DataWarehouse, и таблица FactLoanPayment не имеет PK и может иметь несколько записей для каждого LoanKey и каждого PostedDate. Я попытался
var query = from fld in _dbContext.FactLoanDetail
join flh in _dbContext.FactLoanHistory on fld.LoanKey equals flh.LoanKey
join flp in _dbContext.FactLoanPayment on fld.LoanKey equals flp.LoanKey into lp
from flp in lp.OrderByDescending(p => p.PostedDateKey)
.ThenByDescending(p => p.PaymentSequenceNumber)
.Take(1)
where flh.AsOfDateKey == 20200415
select new {flh.InterestRate, fld].[RegularPaymentAmount}
Он прекрасно компилируется, но во время выполнения выдает предупреждение
orderby [p].PostedDateKey desc, [p].PaymentSequenceNumber desc' could not be translated and will be evaluated locally.
и пытается вернуть все записи по каждому кредиту с сервера, а не только последние.
Я также пытался
var query = from fld in _dbContext.FactLoanDetail
join flh in _dbContext.FactLoanHistory on fld.LoanKey equals flh.LoanKey
join flp in _dbContext.FactLoanPayment on fld.LoanKey equals flp.LoanKey into lp
from flp in lp.OrderByDescending(p => p.PostedDateKey)
.ThenByDescending(p => p.PaymentSequenceNumber).Take(1).DefaultIfEmpty()
join dpm in _dbContext.DimPaymentMethod on flp.PaymentMethodKey equals dpm.PaymentMethodKey
where flh.AsOfDateKey == asOfDateKey &&
flp.PostedDateKey == _dbContext.FactLoanPayment.Where(p => p.LoanKey == flp.LoanKey).Max(m => m.PostedDateKey) &&
flp.PaymentSequenceNumber == _dbContext.FactLoanPayment.Where(p => p.LoanKey == flp.LoanKey).Max(m => m.PaymentSequenceNumber)
, который также сначала перезапускает все записи по кредиту.
Есть ли лучший способ справиться с этим?