LINQ - объединение с подзапросами - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь реализовать следующий запрос в 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)

, который также сначала перезапускает все записи по кредиту.

Есть ли лучший способ справиться с этим?

1 Ответ

0 голосов
/ 24 апреля 2020

решение состояло в том, чтобы использовать другую таблицу (dimLoan), которая имеет ссылку на таблицу FLP в качестве виртуального свойства, что позволило EF правильно разрешить отношение

var query = from fld in _dbContext.FactLoanDetail
  join dimLoan in _dbContext.DimLoan on flh.LoanKey equals dimLoan.LoanKey
  join flh in _dbContext.FactLoanHistory on fld.LoanKey equals flh.LoanKey
  join flp in _dbContext.FactLoanPayment on dimLoan.LoanKey equals flp.LoanKey
 where flh.AsOfDateKey == asOfDateKey &&
       flp.PostedDateKey == (
           dimLoan.FactLoanPayment
              .Where(m => m.LoanKey == flp.LoanKey)
              .Max(x => x.PostedDateKey)) &&
      flp.PaymentSequenceNumber == (
          dimLoan.FactLoanPayment
              .Where(m => m.LoanKey == flp.LoanKey)
              .Max(x => x.PaymentSequenceNumber)) 

...