3

我有一个使用 LINQ 查询调用的表值函数。
正如我现在所理解的(如此处所引用),排序需要在表值函数之外完成。这意味着,我必须在 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

更新

对于视觉参考,这里是被排序的表格。注意顺序。

在此处输入图像描述

4

4 回答 4

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
    );
于 2015-07-19T00:30:23.083 回答
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);
于 2015-07-19T09:23:55.627 回答
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]

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

于 2015-07-19T14:50:30.947 回答
0

按 ArrayList 的索引排序:

    var periods = new List<string>() 
    { "AM1", "AM2", "0", "1", "2", 
        "3", "4", "5", "5A", "5B", "6", "6X", 
        "7", "8", "9", "10", "11", "12" };
                
    var bl2 = (from b in db.Tardies 
as IEnumerable<Tardies> select b)
              .ToList()
              .OrderByDescending(b => 
periods.IndexOf(b.period.Trim()));
于 2021-09-24T15:51:50.120 回答