C# LINQ查询中的自定义排序
我有一个用LINQ查询调用的表值函数。C# LINQ查询中的自定义排序,c#,sql,linq,asp-net-mvc-1,C#,Sql,Linq,Asp Net Mvc 1,我有一个用LINQ查询调用的表值函数。 正如我现在所理解的(参考文献),排序需要在表值函数之外完成。这意味着,我必须在LINQ查询中这样做 Order By CASE WHEN GameType = 'G' THEN '1' WHEN GroupNumber = '1' THEN '2' WHEN GroupNumber = '2' THEN '3' WHEN GroupNumber = '3' THEN '4'
正如我现在所理解的(参考文献),排序需要在表值函数之外完成。这意味着,我必须在LINQ查询中这样做
Order By
CASE
WHEN GameType = 'G' THEN '1'
WHEN GroupNumber = '1' THEN '2'
WHEN GroupNumber = '2' THEN '3'
WHEN GroupNumber = '3' THEN '4'
WHEN GroupNumber = '4' THEN '5'
WHEN GameType = 'GT' THEN '6'
WHEN GameType = 'P' THEN '7'
WHEN GameType = 'FT' THEN '8'
END ASC,
g.GameID ASC
我需要一些语法方面的帮助。这是我最初对函数的调用
var sourceQuery = (from f in db.fGameListDataTable(competitionID, eventID, participantType)
select f);
我需要从SQL查询中获取此自定义排序,并将其添加到LINQ查询中
Order By
CASE
WHEN GameType = 'G' THEN '1'
WHEN GroupNumber = '1' THEN '2'
WHEN GroupNumber = '2' THEN '3'
WHEN GroupNumber = '3' THEN '4'
WHEN GroupNumber = '4' THEN '5'
WHEN GameType = 'GT' THEN '6'
WHEN GameType = 'P' THEN '7'
WHEN GameType = 'FT' THEN '8'
END ASC,
g.GameID ASC
更新
为了便于查看,这里是正在排序的表。注意顺序
您可以构建一个大的条件表达式。不幸的是,它将有八个嵌套级别(恶心!)
可以这样做:
var sourceQuery =
(from f in db.fGameListDataTable(competitionID, eventID, participantType) select f)
.OrderBy(f =>
{
int sortValue = 0;
if (f.GameType == "G")
sortValue = 1;
else if (f.GroupNumber == "1")
sortValue = 2;
else if (f.GroupNumber == "2")
sortValue = 3;
else if (f.GroupNumber == "3")
sortValue = 4;
else if (f.GroupNumber == "4")
sortValue = 5;
else if (f.GameType == "GT")
sortValue = 6;
else if (f.GameType == "P")
sortValue = 7;
else if (f.GameType == "FT")
sortValue = 8;
return sortValue;
}).ThenBy(f => f.GameID);
我仍然不明白为什么不能使用DB引擎根据您描述的条件生成该数字 您已经将其作为示例代码提供:
Order By
CASE
WHEN GameType = 'G' THEN '1'
WHEN GroupNumber = '1' THEN '2'
WHEN GroupNumber = '2' THEN '3'
WHEN GroupNumber = '3' THEN '4'
WHEN GroupNumber = '4' THEN '5'
WHEN GameType = 'GT' THEN '6'
WHEN GameType = 'P' THEN '7'
WHEN GameType = 'FT' THEN '8'
END ASC,
g.GameID ASC
现在,虽然我知道您可能不希望(甚至可以)在table value函数中包含这个确切的代码(根据您的链接,ORDER BY
需要在函数之外),但我几乎可以肯定您仍然可以使用CASE
语句来生成额外的列
我不是说你应该在服务器上订购。只需使用CASE语句生成附加列,就可以使用该列作为LINQ查询的order by
在我之前的评论中,当我提到添加一个额外的列时,我指的不仅仅是一个连续的列,我指的是我上面写的内容。该额外列的值将基于完全相同的逻辑,但将在服务器上生成,而不是尝试在LINQ客户端实现它
问候
编辑:
下面是一段代码片段,显示了table value函数中的情况:
INSERT INTO @Table
SELECT EventID, GameID, [all you other columns],
CASE
WHEN GameType = 'G' THEN '1'
WHEN GroupNumber = '1' THEN '2'
WHEN GroupNumber = '2' THEN '3'
WHEN GroupNumber = '3' THEN '4'
WHEN GroupNumber = '4' THEN '5'
WHEN GameType = 'GT' THEN '6'
WHEN GameType = 'P' THEN '7'
WHEN GameType = 'FT' THEN '8'
END
FROM [Whatever you pull your columns from]
这只是一个示例,不是实际代码。您是否控制SQL函数的代码?不能在返回的“表”中添加一个额外的列吗?是的,这是我的函数。你能解释一下这个额外的列是什么意思吗?也许有什么我不明白的地方,但是为什么不直接从数据库函数返回这个额外的排序列呢?然后你可以简单地根据它排序。事实上,我刚刚试过你的想法。不,这不起作用,因为它不仅仅是给每一列指定一个值。例如,某些记录的游戏类型可以为“G”,而组号可以为“1”。您可以使用.net中表达式的功能。这不起作用,因为它在多个级别上排序。看看我的示例中的第一条记录(GameID279)。根据这个逻辑,你首先会因为游戏类型而分配1,然后你会用2覆盖它,因为它是组号1。此外,您还可以为多个记录分配相同的值。这对这类人有什么帮助?最初的SQL案例逻辑首先对一个小组进行排序,然后继续对该小组的其他级别进行排序。老实说,我看不出您的示例SQL案例有什么不同。也许如果你发布了整个原始的table函数,就是那个不起作用的函数?我认为这可能是解决方案。我会让你知道我什么时候能考出来。这会影响性能吗?@madvora我怀疑您会得到与此相同的生成SQL(即使用
CASE
表达式),因此我认为性能不会有什么不同。