在LINQ查询中自定义排序

时间:2015-07-19 00:22:57

标签: c# sql linq asp-net-mvc-1

我有一个表值函数,我用LINQ查询调用 正如我现在所理解的那样(引用here),排序需要在表值函数之外完成。这意味着,我必须在LINQ查询中执行此操作。

我需要一些语法帮助。这是我对该功能的原始调用。

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

更新

对于视觉参考,这里是排序的表格。请注意订单。

enter image description here

3 个答案:

答案 0 :(得分:4)

您可以构建一个大的条件表达式。不幸的是,它将有八个级别的嵌套(哎呀!)

var ordered = (from f in ... select ...)
    .OrderBy(f =>
        f.GameType == 'G' ? 1
    :   f.GroupNumber == '1' ? 2
    :   f.GroupNumber == '2' ? 3
    :   f.GroupNumber == '3' ? 4
    :   f.GroupNumber == '4' ? 5
    :   f.GameType == 'GT'   ? 6
    :   f.GameType == 'P'    ? 7
    :   f.GameType == 'PT'   ? 8
    :   9
    );

答案 1 :(得分:2)

可以这样做:

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);

答案 2 :(得分:0)

我仍然不明白为什么你不能根据你描述的条件使用数据库引擎来生成这个数字。

您已将此作为示例代码:

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

现在,虽然我知道您可能不希望(甚至可以)在您的表值函数中使用这个确切的代码(根据您的链接,ORDER BY需要在函数之外),我'很可靠,您仍然可以使用CASE语句生成其他列。

我并不是说您应该在服务器上进行ORDER BY。只需使用CASE语句生成附加列,然后您就可以使用该列作为LINQ查询的顺序。

在我之前的评论中,当我提到添加一个额外的列时,我并不仅仅意味着一个连续的列,我的意思是我上面写的。额外列的值将基于您完全相同的逻辑,但将在服务器上生成,而不是尝试在LINQ客户端实现它。

此致

编辑:

这是一个代码段,显示了表值函数中的内容:

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]

这只是一个例子,而不是实际的代码。