Я извиняюсь, если подобный вопрос уже задавали в VB.Net для RANK() и СЛУЧАЙ, КОГДА.LINQ для RANK() и случай, когда в VB.NET
У меня есть две таблицы. Сценарий с необходимыми столбцами ниже:
Таблица 1:
SELECT S.* INTO dbo.LoanHeader
FROM
(
SELECT 1 LoanHeaderId, 1234 LoanNumber, GETDATE() EffectiveOn
UNION ALL
SELECT 2 LoanHeaderId, 2234 LoanNumber, GETDATE() EffectiveOn
UNION ALL
SELECT 3 LoanHeaderId, 3234 LoanNumber, GETDATE() EffectiveOn
)S
Таблица 2:
SELECT S.* INTO dbo.LoanHeaderHistory
FROM
(
SELECT 1 LoanHeaderId, 1 NewValue, 'LoanReviewStatusId' ColumnName, DATEADD(DD, -3, GETDATE()) EnteredDate
UNION ALL
SELECT 1 LoanHeaderId, 2 NewValue, 'LoanReviewStatusId' ColumnName, DATEADD(DD, -2, GETDATE()) EnteredDate
UNION ALL
SELECT 1 LoanHeaderId, 3 NewValue, 'LoanReviewStatusId' ColumnName, DATEADD(DD, -1, GETDATE()) EnteredDate
UNION ALL
SELECT 1 LoanHeaderId, 1 NewValue, 'LoanReviewStatusId' ColumnName, GETDATE() EnteredDate
)S
Я хотел бы написать LINQ заявление в VB.Net в в SQL ниже. Существуют и другие таблицы, и если я начну упоминать, почему мне это нужно, это займет слишком много времени. Но намерение состоит в том, чтобы использовать одну из дат, основанных на NewValue в критериях:
SELECT
LH.LoanHeaderId,
LHH.NewValue,
LHH.EnteredDate
FROM dbo.LoanHeader LH
LEFT JOIN
(
SELECT
LoanHeaderId,
NewValue,
EnteredDate,
RANK() OVER (PARTITION BY LoanHeaderId ORDER BY EnteredDate DESC) HRank
FROM dbo.LoanHeaderHistory
WHERE ColumnName = 'LoanReviewStatusId'
)LHH ON LHH.LoanHeaderId = LH.LoanHeaderId AND LHH.HRank = 1
WHERE CASE WHEN ISNULL(LHH.NewValue, 1) IN (2, 3) THEN LHH.EnteredDate ELSE LH.EffectiveOn END >= LH.EffectiveOn
Я начал делать это таким образом:
Dim columnName = "LoanReviewStatusId"
Dim query = (From lh In e.LoanHeaderEntities_
From lhh In e.LoanHeaderHistoryEntities.OrderByDescending(Function(i) i.EnteredDate).Where(Function(i) lh.LoanHeaderId = i.LoanHeaderId AndAlso i.ColumnName = columnName).DefaultIfEmpty() _
Select New With{ _
lh.LoanHeaderId, _
lhh.NewValue, _
lhh.EnteredDate _
})
query = query.Where(Function(i) If(Not IsNothing(i.LoanReviewStatusId) AndAlso (i.LoanReviewStatusId = 2 Or i.LoanReviewStatusId = 3), i.LoanStatusChangedDate, i.EffectiveOn) >= i.EffectiveOn)
Return query.ToList()