【发布时间】:2014-02-10 23:34:47
【问题描述】:
抱歉,如果 VB.Net 中已经针对 RANK() 和 CASE WHEN 提出了类似的问题。
我有两张桌子。具有所需列的脚本如下:
表 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
我想在VB.Net中写一个LINQ语句下面的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()
【问题讨论】:
标签: vb.net linq sql-order-by case-when