我正在使用Entity Framework 6,我的一个表有一个整数列,它实际上保存了C#Enum中的值(不以任何方式表示在DB中),我需要根据Enum成员名称对该列进行排序。
通过以下SQL可以完全实现这一点:
SELECT *
FROM [Foo] AS [t0]
ORDER BY
(CASE
WHEN [t0].[Bar] = 3 THEN 'A'
WHEN [t0].[Bar] = 1 THEN 'B'
WHEN [t0].[Bar] = 2 THEN 'C'
ELSE 'D'
END)
GO
以下LINQ代码完全符合我的需要(有警告),
Foo.OrderBy(x =>
x.Bar == 3 ? "A" :
x.Bar == 1 ? "B" :
x.Bar == 2 ? "C" :
"D")
......需要注意的是,EF将内联值转换为参数,这使查询的速度降低了一个数量级。
-- Region Parameters
DECLARE @p0 Int = 3
DECLARE @p1 NVarChar(1000) = 'A'
DECLARE @p2 Int = 1
DECLARE @p3 NVarChar(1000) = 'B'
DECLARE @p4 Int = 2
DECLARE @p5 NVarChar(1000) = 'C'
DECLARE @p6 NVarChar(1000) = 'D'
-- EndRegion
SELECT *
FROM [Foo] AS [t0]
ORDER BY
(CASE
WHEN [t0].[Bar] = @p0 THEN @p1
WHEN [t0].[Bar] = @p2 THEN @p3
WHEN [t0].[Bar] = @p4 THEN @p5
ELSE @p6
END)
有人可以建议如何强制EF6内联值,而不是在特定情况下使用参数?