2009-07-06 2 views
1

0 이외의 시작 인덱스를 사용하여 Skip() 메서드를 호출하면 메서드가 자동으로 기존의 order-by 열에 추가 열을 자동으로 추가합니다 . 이러한 추가 order-by 열은 정렬식이 아닌 나머지 열로 구성됩니다. 반환 된 데이터에 대한 결정적 정렬을 제공하므로 LINQ가 자동으로 처리하지만, 예를 들어 첫 번째 페이지를 쿼리 할 때 Skip() 메서드에 0이 전달되면 메서드가 최적화 된 것처럼 보입니다. 앞서 언급 한 추가 order-by 열은 렌더링되지 않습니다. 정렬 조건이 Skip (0)과 Skip (n)간에 일치하지 않기 때문에 문제가 발생합니다.LINQ 건너 뛰기 (0) vs 건너 뛰기 (n), 일치하지 않는 정렬 식 반환

다른 개발자 인 Dave도 같은 문제를 지적했습니다. 인용구 : http://www.eggheadcafe.com/conversation.aspx?messageid=32045245&threadid=32045239

사람이 유사한 문제가 발생합니까 : 스레드에 대한 링크는 "(0) 내지 (n) ... 않는 건너 뛰기 동일한 행 번호 SQL을 생성해야 건너 뛰기?" 다행히도 우리가 쿼리하는 데이터에는 ID 열이 있으므로 우리는 항상 ID 정렬 열을 기존 정렬 식에 추가해야합니다. 우리는 다른 창의적인 방법이나 해결책을 듣고 싶습니다. 두 쿼리는 아래의 데이터베이스에서 동일한 열을 선택하고


예 열, RequestReceivedDate에 하강 순서를 포함한다. Skip (10)에 의해 생성 된 쿼리가 동일한 RequestReceivedDate가있는 레코드가있을 때 다른 데이터 정렬을 발생시키는 나머지 열에 대해 추가 순서를 추가하는 방법에 유의하십시오. 이러한 추가 정렬을 추가하는 아이디어는 훌륭합니다. 그러나 라이브러리는 Skip (0)에 대해 동일한 로직을 구현해야하므로 Skip (0)과 Skip (n)은 같은 순서로 데이터를 반환합니다.

[스킵 의해 생성 된 쿼리 (0) .Take (10)]

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 

[질의 스킵 의해 생성 된 (10) .Take (10)]

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] 
+0

LINQ 쿼리를 포함 할 수 있습니까? Skip이 잘못된 위치에있을 수 있습니다. –

답변

0

링크에서 이것은 LINQ to SQL 질문과 유사합니다. 그리고 LINQ가 건너 뛴 후에 다른 결과를 반환하는 정렬되지 않은 SELECT가 있습니다.

그러나 order by 절을 지정하지 않으면 SQL에서 행을 반환하는 순서에 의존 할 수 없습니다.

전체 샘플을 제공 할 수 있습니까?

+0

안녕하세요 샘, 답장을 보내 주셔서 감사합니다. 귀하의 검토를위한 예를 포함 시켰습니다. 감사합니다 - 마틴 –