Ha! I did it. I found some helpful info from here.
The VB.Net code is
Dim query = (From lh In e.LoanHeaderEntities _
From lhhGrp In e.LoanHeaderHistoryEntities.Where(Function(i) i.ColumnName = colName And i.LoanHeaderId = lh.LoanHeaderId) _
.OrderByDescending(Function(i) i.EnteredDate) _
.Take(1) _
.DefaultIfEmpty() _
Select New HeaderInfo With {_
.LoanHeaderId = lh.LoanHeaderId, _
.EffectiveOn = lh.EffectiveOn, _
.LoanStatusChangedDate = lhhGrp.EnteredDate, _
.LoanReviewStatusId = lhhGrp.NewValue _
})
'Additional condition for CASE WHEN
If (isActive) Then
query = query.Where(Function(i) If(i.LoanReviewStatusId = LoanReviewStatus.Final Or i.LoanReviewStatusId = LoanReviewStatus.Completed, i.LoanStatusChangedDate, i.EffectiveOn) >= i.EffectiveOn)
End If
Return query.ToList()
I could not stop laughing when I saw the query it executes behind the scenes. Check the CASE WHEN statement it generates below. I ignored the ISNULL because my field is NOT NULL.
SELECT
[Extent1].LoanHeaderId,
[Limit1].NewValue,
[Limit1].EnteredDate
FROM [dbo].[LoanHeader] AS [Extent1]
OUTER APPLY
(
SELECT TOP (1)
[Project1].[LoanHeaderId] AS [LoanHeaderId],
[Project1].[NewValue] AS [NewValue],
[Project1].[EnteredDate] AS [EnteredDate]
FROM
(
SELECT
[Extent2].[LoanHeaderId] AS [LoanHeaderId],
[Extent2].[NewValue] AS [NewValue],
[Extent2].[EnteredDate] AS [EnteredDate]
FROM [dbo].[LoanHeaderHistory] AS [Extent2]
WHERE ([Extent2].[ColumnName] = 'LoanReviewStatusId')
AND ([Extent2].[LoanHeaderId] = [Extent1].[LoanHeaderId])
) AS [Project1]
ORDER BY [Project1].[EnteredDate] DESC
) AS [Limit1]
WHERE ((CASE WHEN ((CASE WHEN (CASE WHEN ((3 = CAST( [Limit1].[NewValue] AS int)) OR (2 = CAST( [Limit1].[NewValue] AS int))) THEN cast(1 as bit) WHEN ( NOT ((3 = CAST( [Limit1].[NewValue] AS int)) OR (2 = CAST( [Limit1].[NewValue] AS int)))) THEN cast(0 as bit) END IS NULL) THEN cast(0 as bit) WHEN ((3 = CAST( [Limit1].[NewValue] AS int)) OR (2 = CAST( [Limit1].[NewValue] AS int))) THEN cast(1 as bit) WHEN ( NOT ((3 = CAST( [Limit1].[NewValue] AS int)) OR (2 = CAST( [Limit1].[NewValue] AS int)))) THEN cast(0 as bit) END) = 1) THEN CAST( [Limit1].[EnteredDate] AS datetime) ELSE CAST( [Extent1].[EffectiveOn] AS datetime) END) >= CAST( [Extent1].[EffectiveOn] AS datetime))
Tell me who is better in writing queries, EF or me?