开发者社区 问答 正文

如何使EF核心将自定义排序转换为普通的“何时”而不是分层

该问题是-我得到以下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 

展开
收起
Puppet 2020-01-04 12:45:10 501 分享 版权
1 条回答
写回答
取消 提交回答
  • 您正在遇到由#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) 
    
    2020-01-04 12:45:54
    赞同 展开评论
问答分类:
问答地址: