>

프로젝트를 .net core 2.1에서 3.1로 업그레이드하고 있으며 EF와 관련하여 다음과 같은 문제가 있습니다. 다음 코드가 있습니다 :

var all = this.Context.Devices.OrderBy(c => c.Id).Where(predicate).Distinct();
var result = await all.Skip(pagedRequest.Offset).Take(pagedRequest.Limit).ToListAsync();
var totalCount = await all.CountAsync();

기본적으로 페이지 매김에 사용되며 클라이언트에게 총 요소 수를 제공합니다. 술어는 동적으로 생성 된 필터 조건입니다. Distinct ()가 실제로 사용되는 이유는 아직 알지 못합니다 (내가 직면하고있는 오래된 코드입니다). 필요한 경우에는 논쟁의 여지가 있지만 확실히 유효하므로 질문을 변경하지 않습니다. 그러나 다음 SQL이 생성됩니다.

SELECT [d].[Id], ...
FROM [Device] AS [d]
WHERE ([d].[State] = 2) AND EXISTS (
    SELECT 1
    FROM [AnotherTable] AS [r]
    WHERE ([d].[Id] = [r].[DeviceId]) AND ([r].[UserId] = 1))
ORDER BY (SELECT 1)
OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY

그리고 ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 보다 .net ef 2.1에는 나타나지 않았습니다. 나는 주요 변경 사항을 살펴 보았고 그것을 설명 할 수있는 것을 찾지 못했습니다. 또한 도대체 ORDER BY (SELECT 1) 가 무엇인지 이해하지 못합니다  그리고 ID가 아닌 순서대로 생성되는 이유는 무엇입니까?

이제 EF 2.1과 동일한 코드로 생성 된 SQL을 확인했습니다. ORDER BY [c].[Id] 가 있다는 것만 똑같습니다.   ORDER BY (SELECT 1) 대신 , 예상대로

누군가이 행동을 설명 할 수 있습니까?

P.S .: 또 다른 흥미로운 점은 내가 all 위로 마우스를 가져 가면  디버거에서 결과보기를 보면 객체가 있습니다. 건너 뛰기와 가져 오기가 추가 된 두 번째 코드 줄에서 예외가 발생합니다.

  • 답변 # 1

    OrderBy  뒤에 Distinct  그 all 의미  정의 된순서가 없습니다 ( Distinct  물건을 주문할 수 있고 다시 주문할 수 있습니다.)

    이것은 Skip  그리고 Take  정렬되지 않은 행 집합에 대해 작동하기 때문에 잘못 정의되어 있습니다.

    그래서 코드는 항상 깨졌습니다. 이제는 더 분명해졌습니다.

    확실히 Skip  그리고 Take   IOrderedEnumerable 에 대하여 일하고있다 보다 구체적으로 말하면고유로모든 행의 순서를 정의하면 코드가 잘 정의되고특정순서가 EF 코드에 반영됩니다 생성합니다.

    그 방법 중 하나는 Distinct 를 제거하는 것입니다 . 다른 하나는 OrderBy 에 대한 또 다른 전화 일 것입니다   Distinct .

    <시간> 와이즈 비즈 와이즈 비즈

    I don't understand what the heck is 가 없을 때 생성 된 경고를무음으로 발견하는 것은 불행한 해결 방법입니다.   ORDER BY (SELECT 1) 를 사용할 때 지정됩니다 . 불행히도, 사람들은 경고가 정당한 이유가 있다고 생각하기보다는 (EF와 같은 도구를 사용하는 사람들조차도) 행을 정렬 할 수 없습니다.

  • 답변 # 2

    감각 감지가 없습니다. 당신의 ORDER BY 이후  기본 키입니다. 그리고 SQL Server에서는 기본 키가 클러스터됩니다. 이는 이미 테이블에서 주문되었음을 의미합니다. 그래서 FETCH NEXT  그리고 Id  출력에는 영향을 미치지 않습니다. 그러나 ORDER BY (SELECT 1)  쿼리 분석기의 작업이 쉬워 질 수 있습니다.

    ORDER BY [c].[Id]

관련 자료

  • 이전 wordpress - 첨부 파일에 빈 제목을 허용하는 방법은 무엇입니까?
  • 다음 r - 데이터 프레임에서 길이 1의 고유 한 요소 찾기