【发布时间】:2019-09-02 11:51:28
【问题描述】:
我正在尝试查询表并根据状态列以指定的自定义顺序返回行。
这是一个非常直接的SQL 查询:
SELECT * From Table1
WHERE Id = 1
ORDER by CASE
WHEN [Status] = 'Status1' THEN 1
WHEN [Status] = 'Status2' THEN 2
WHEN [Status] = 'Status3' THEN 3
WHEN [Status] = 'Status4' THEN 4
WHEN [Status] = 'Status5' THEN 5
WHEN [Status] = 'Status6' THEN 6
WHEN [Status] = 'Status7' THEN 7
WHEN [Status] = 'Status8' THEN 8
WHEN [Status] = 'Status9' THEN 9
WHEN [Status] = 'Satus10' THEN 10
WHEN [Status] = 'Status11' THEN 11
ELSE [Status] END ASC
我正在尝试使用 LINQ 完成相同的查询。
var data = _myContext.Table1.Where(l => l.Id == 1).Select(lp =>
new DataModel
{
Id = lp.Id,
Status = lp.Status,
...
})
.OrderBy(l =>
l.Status == StatusEnum.Status1.ToString() ? 1 :
l.Status == StatusEnum.Status2.ToString() ? 2 :
l.Status == StatusEnum.Status3.ToString() ? 3 :
l.Status == StatusEnum.Status4.ToString() ? 4 :
l.Status == StatusEnum.Status5.ToString() ? 5 :
l.Status == StatusEnum.Status6.ToString() ? 6 :
l.Status == StatusEnum.Status7.ToString() ? 7 :
l.Status == StatusEnum.Status8.ToString() ? 8 :
l.Status == StatusEnum.Status9.ToString() ? 9 :
l.Status == StatusEnum.Status10.ToString() ? 10 :
l.Status == StatusEnum.Sattus11.ToString() ? 11 : 0
);
但是这个查询失败了:
案例表达式只能嵌套到第 10 级。
查看分析器,我看到 EF 创建了以下查询,但由于我指定了超过 10 个值,因此返回失败:
exec sp_executesql N'SELECT [l].[Id],[l].[Status], ...
FROM [Table1] AS [l]
WHERE [l].[Id] = @__id_0
ORDER BY CASE
WHEN [l].[Status] = @__ToString_1
THEN 1 ELSE CASE
WHEN [l].[Status] = @__ToString_2
THEN 2 ELSE CASE
WHEN [l].[Status] = @__ToString_3
THEN 3 ELSE CASE
WHEN [l].[Status] = @__ToString_4
THEN 4 ELSE CASE
WHEN [l].[Status] = @__ToString_5
THEN 5 ELSE CASE
WHEN [l].[Status] = @__ToString_6
THEN 6 ELSE CASE
WHEN [l].[Status] = @__ToString_7
THEN 7 ELSE CASE
WHEN [l].[Status] = @__ToString_8
THEN 8 ELSE CASE
WHEN [l].[Status] = @__ToString_9
THEN 9 ELSE CASE
WHEN [l].[Status] = @__ToString_10
THEN 10 ELSE CASE
WHEN [l].[Status] = @__ToString_11
THEN 11 ELSE 0
END
END
END
END
END
END
END
END
END
END
END',N'@__id_0 int,@__ToString_1 nvarchar(4000),@__ToString_2 nvarchar(4000),@__ToString_3 nvarchar(4000),@__ToString_4 nvarchar(4000),@__ToString_5 nvarchar(4000),@__ToString_6 nvarchar(4000),@__ToString_7 nvarchar(4000),@__ToString_8 nvarchar(4000),@__ToString_9 nvarchar(4000),@__ToString_10 nvarchar(4000),@__ToString_11 nvarchar(4000)',@__id_0=1,@__ToString_1=N'Status1',@__ToString_2=N'Status2',@__ToString_3=N'Status3',@__ToString_4=N'Status4',@__ToString_5=N'Status5',@__ToString_6=N'Status6',@__ToString_7=N'Status7',@__ToString_8=N'Status8',@__ToString_9=N'Status9',@__ToString_10=N'Status10',@__ToString_11=N'Status11'
有没有办法写这个查询,所以它不使用ELSE CASE,只匹配上面的SQL查询?
我确实没有几个选项可以绕过这个。编写一个存储过程并获取我需要的输出或将查询存储在没有OrderBy 的列表中并订购列表。但我很好奇是否有办法在该查询中执行此操作。
【问题讨论】:
-
SQL 查询工作正常。是需要修改 LINQ 查询。
标签: c# sql linq entity-framework-core