该问题是-我得到以下errror:
案例表达式只能嵌套到级别10。
当我尝试将以下LINQ代码与EF内核一起使用时
var extendedResult = result.Select(p => new
{
readModelFields = p,
sortKey =
p.CaseState == CaseState.Scheduled.ToString() ? 1 :
p.CaseState == CaseState.Queued.ToString() ? 2 :
p.CaseState == "Investigation" ? 3 :
p.CaseState == "Awaiting Customer" ? 4 :
p.CaseState == "State 5" ? 5 :
p.CaseState == "State 6" ? 6 :
p.CaseState == "State 7" ? 7 :
p.CaseState == "State 8" ? 8 :
p.CaseState == "State 9" ? 9 :
p.CaseState == "State 10" ? 10 :
p.CaseState == "State 11" ? 11 :
p.CaseState == "Rejected" ? 12 :
p.CaseState == "Blocked" ? 13 :
p.CaseState == "Postponed" ? 14 :
15
});
return IsAscending(query.SortDirection)
? extendedResult.OrderBy(p => p.sortKey).Select(p => p.readModelFields)
: extendedResult.OrderByDescending(p => p.sortKey).Select(p => p.readModelFields);
问题是由SQL生成SQL的方式引起的(这是结果)
exec sp_executesql N'SELECT [o].[Id], [o].[Owner], [o].[CaseState], [o].[LastActionDate], [o].[CountryCode], [o].[Name], [o].[Risk]
FROM [dbo].[OpenCases] AS [o]
ORDER BY CASE
WHEN [o].[CaseState] = N''Scheduled'' THEN 1
ELSE CASE
WHEN [o].[CaseState] = N''Queued'' THEN 2
ELSE CASE
WHEN [o].[CaseState] = N''Investigation'' THEN 3
ELSE CASE
WHEN [o].[CaseState] = N''Awaiting Customer'' THEN 4
ELSE CASE
WHEN [o].[CaseState] = N''State 6'' THEN 6
ELSE CASE
WHEN [o].[CaseState] = N''State 7'' THEN 7
ELSE CASE
WHEN [o].[CaseState] = N''State 8'' THEN 8
ELSE CASE
WHEN [o].[CaseState] = N''State 9'' THEN 9
ELSE CASE
WHEN [o].[CaseState] = N''State 10'' THEN 10
ELSE CASE
WHEN [o].[CaseState] = N''State 11'' THEN 11
ELSE CASE
WHEN [o].[CaseState] = N''Rejected'' THEN 12
ELSE CASE
WHEN [o].[CaseState] = N''Blocked'' THEN 13
ELSE CASE
WHEN [o].[CaseState] = N''Postponed'' THEN 14
ELSE 15
END
END
END
END
END
END
END
END
END
END
END
END
END DESC
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=2147483647
我想要的是-EF建立这样的查询:
...
ORDER BY
CASE
WHEN CaseState = "Investigation" THEN 3
WHEN CaseState = "State 5" THEN 5
WHEN CaseState = "State 6" THEN 6
WHEN CaseState = "State 7" THEN 7
.......
WHEN CaseState = "Postponed" THEN 14
END desc
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您正在遇到由#12729跟踪的EF Core查询翻译错误:展平CASE表达式,以避免出现错误“ Case表达式只能嵌套到10级”。正如我们所看到的,它已经在EF Core存储库中修复,但是此修复将包含在5.0.0版本中(无论何时发布)。
可以通过连接到EF Core内部基础结构来对其进行修复,但这需要了解确切的EF Core版本,并且还需要对不同的EF Core版本使用不同的方法,因为该基础结构几乎每一个次要版本都会发生变化。
作为一般的解决方法,我建议使用多个单个条件表达式的总和来替换单个多条件运算符。它不会生成所需的平面CASESQL表达式,但至少不会产生相关的错误。像这样:
sortKey =
(p.CaseState == CaseState.Scheduled.ToString() ? 1 : 0) +
(p.CaseState == CaseState.Queued.ToString() ? 2 : 0) +
(p.CaseState == "Investigation" ? 3 : 0) +
(p.CaseState == "Awaiting Customer" ? 4 : 0) +
(p.CaseState == "State 5" ? 5 : 0) +
(p.CaseState == "State 6" ? 6 : 0) +
(p.CaseState == "State 7" ? 7 : 0) +
(p.CaseState == "State 8" ? 8 : 0) +
(p.CaseState == "State 9" ? 9 : 0) +
(p.CaseState == "State 10" ? 10 : 0) +
(p.CaseState == "State 11" ? 11 : 0) +
(p.CaseState == "Rejected" ? 12 : 0) +
(p.CaseState == "Blocked" ? 13 : 0) +
(p.CaseState == "Postponed" ? 14 : 15)