Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ Skip(0)与Skip(n),返回不一致的排序表达式_Linq - Fatal编程技术网

LINQ Skip(0)与Skip(n),返回不一致的排序表达式

LINQ Skip(0)与Skip(n),返回不一致的排序表达式,linq,Linq,当使用非0的起始索引调用Skip()方法时,该方法会自动在现有的order by column之外追加其他列。这些附加的order by列由排序表达式中不存在的其余列组成。LINQ为我们自动处理这一点做得很好,因为它为返回的数据提供了确定性排序;但是,如果将0传递给Skip()方法(例如,在查询第一个页面时),则该方法似乎已优化,并且不会呈现前面提到的附加order by列。这是有问题的,因为Skip(0)和Skip(n)之间的排序条件不一致 另一位开发者Dave也指出了同样的问题。 Quote

当使用非0的起始索引调用Skip()方法时,该方法会自动在现有的order by column之外追加其他列。这些附加的order by列由排序表达式中不存在的其余列组成。LINQ为我们自动处理这一点做得很好,因为它为返回的数据提供了确定性排序;但是,如果将0传递给Skip()方法(例如,在查询第一个页面时),则该方法似乎已优化,并且不会呈现前面提到的附加order by列。这是有问题的,因为Skip(0)和Skip(n)之间的排序条件不一致

另一位开发者Dave也指出了同样的问题。 Quote:“跳过(0)应生成与跳过(n)相同的行编号sql…” 指向线程的链接:

有没有人遇到过类似的问题?幸运的是,我们查询的数据有一个标识列,因此我们提出的一个解决方法是始终将标识列附加到现有的排序表达式中。我们希望听到其他创造性的方法或解决方案


示例

下面的两个查询都从数据库中选择相同的列,并在列RequestReceivedDate上包含下降顺序。请注意,Skip(10)生成的查询如何为其余列追加额外的排序,这会在存在具有相同RequestReceivedDate的记录时导致不同的数据排序。附加这些额外排序的想法很棒;但是,库应该为Skip(0)实现相同的逻辑,因此Skip(0)和Skip(n)将以相同的顺序返回数据

[跳过(0)生成的查询。执行(10)]

[跳过(10)生成的查询。获取(10)]

显然,:

跳过(0)不再阻止快速加载

显然,:

跳过(0)不再阻止快速加载


从链接上看,这看起来像一个LINQ到SQL的问题。还有一个无序的选择,LINQ在跳过后返回不同的结果

但是,除非指定ORDERBY子句,否则不能依赖SQL返回其行的顺序


你能提供完整的样品吗

从链接上看,这似乎是一个LINQ到SQL的问题。还有一个无序的选择,LINQ在跳过后返回不同的结果

但是,除非指定ORDERBY子句,否则不能依赖SQL返回其行的顺序


你能提供完整的样品吗

你好,山姆,谢谢你的回复。我已经包括了一个例子供您回顾。谢谢-MartinHi Sam,谢谢你的回复。我已经包括了一个例子供您回顾。谢谢-Martin如果您能包含LINQ查询,那么您的跳过可能位于错误的位置。如果您能包含LINQ查询,那么您的跳过可能位于错误的位置。
SELECT TOP (10) [t31].[PersonId], [t31].[value] AS [RequestReceivedDate2], ....
FROM (
    SELECT [t0].[PersonId], (
        SELECT MAX([t8].[RequestReceivedDate])
        FROM [dbo].[EnrollRequest] AS [t8]
        WHERE EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [dbo].[DomainAccount] AS [t9]
            WHERE ([t9].[DomainAccountId] = [t8].[DomainAccountId]) AND ([t9].[PersonId] = ([t0].[PersonId]))
            )
        ) AS [value], ... 
    ) AS [t31]
ORDER BY [t31].[value] DESC
SELECT [t32].[PersonId], [t32].[value] AS [RequestReceivedDate2], ...
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t31].[value] DESC) AS [ROW_NUMBER], [t31].[PersonId], [t31].[value], [t31].[FullAccountName], [t31].[LastName], ...
    FROM (
        SELECT [t0].[PersonId], (
            SELECT MAX([t8].[RequestReceivedDate])
            FROM [dbo].[EnrollRequest] AS [t8]
            WHERE EXISTS(
                SELECT NULL AS [EMPTY]
                FROM [dbo].[DomainAccount] AS [t9]
                WHERE ([t9].[DomainAccountId] = [t8].[DomainAccountId]) AND ([t9].[PersonId] = ([t0].[PersonId]))
                )
            ) AS [value], ...
    ) AS [t32]
WHERE [t32].[ROW_NUMBER] BETWEEN @p21 + 1 AND @p21 + @p22
ORDER BY [t32].[ROW_NUMBER]