C# 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查询调用的表值函数。
正如我现在所理解的(参考文献),排序需要在表值函数之外完成。这意味着,我必须在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
表达式),因此我认为性能不会有什么不同。