프로젝트를 .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
-
답변 # 2
감각 감지가 없습니다. 당신의
ORDER BY
이후 기본 키입니다. 그리고 SQL Server에서는 기본 키가 클러스터됩니다. 이는 이미 테이블에서 주문되었음을 의미합니다. 그래서FETCH NEXT
그리고Id
출력에는 영향을 미치지 않습니다. 그러나ORDER BY (SELECT 1)
쿼리 분석기의 작업이 쉬워 질 수 있습니다.ORDER BY [c].[Id]
관련 자료
- sql - 순서 및 상태별로 테이블 파티션에서 선택
- php - 내 데이터와 함께로드 할 가상 필드를 선택하는 방법이 있습니까? Cakephp 3
- ios - 이전 화면에서 선택한 날짜에 +1 또는 -1을 수행하려면 어떻게합니까?
- sql server - 직원이 각 관리자에 대해 참여한 순서를 포함하는 SQL 쿼리
- Oracle Sql - oracle sql - 주문이 반복되는 열 id 당 한 줄씩 나열하여 주문이 둘 이상인 고객을 선택하십시오
- sql server - 개체가 특정 속성을 갖는 모든 날짜를 선택하십시오
- javascript - 속성이 arrayreduce () 반환 객체에 추가되는 순서
- oracle - sql - 순서대로 여러 개의 최대 값을 선택
- mysql - select 문이있는 여러 데이터를 삽입하고 해당 select 문의 FROM 테이블은 삽입하려는 테이블과 같습니다
- "ul"/ "li"태그가있는 HTML DOM에서 Selenium 선택 클래스를 사용하는 방법
- sql - PSQL은 a와 b가 모두 존재하는 경우 a와 b를 순서대로 선택하지만 a와 b를 모두 선택하지는 않습니다
- javascript - 요소를 클릭하려면 어떤 요소 값을 선택해야합니까
- blazor - MudBlazor 선택 드롭 다운은 투명하지 않아야합니다
- python 3.x - 나는 icontains보다 먼저 istarts로 주문한 django에서 검색을 만들고 싶습니다
- awk로 같은 방식으로 채워진 두 배열의 요소 순서가 동일합니까?
- amazon web services - 주어진 날짜 범위에 대해 'year = yyyy/month = MM/date = dd /'와 같이 분할 된 aws athena 테이블에서 데이터를 선택하는 방법은 무엇입니까?
- flutter - 스트림 공급자이지만 실제 llist의 순서를 변경하지 않는 목록을 정렬합니다
- sql server - SQL 복제는 어떤 순서로 데이터를 작성합니까?
- sql server - sql 구문 오류 - select distinct, order by 표현식이 선택 목록에 나타나야합니다
- sql - 각 클라이언트에 대해 첫 번째 및 n 번째 순서를 선택하십시오
- .net - SQL Server에서 호출 저장 프로 시저를 확인하는 방법
- .net - 쿼리에서 중첩 된 case 문으로 레코드를 업데이트하지 않는 SQL 서버
- sql - 특정 접두사가있는 테이블에서 데이터를 가져 오는 방법은 무엇입니까?
- 여러 테이블의 데이터를 확인하고 SQL Server의 올바른 테이블에서 결과를 얻으려면 어떻게해야합니까?
- sql - 삽입시 트리거를 만들려고 할 때 다중 부분 식별자 오류
- sql server - 일부 테이블에 존재하고 다른 테이블에 존재하지 않는 데이터를 찾는 SQL
- sql - datetime 열의 날짜 부분에 CONSTRAINT 추가
- c# - 저장 프로 시저에서 출력 매개 변수 결과 및 쿼리 결과를 얻는 방법은 무엇입니까?
- sql server - 그룹당 최대 값을 포함하는 두 번째 테이블의 행 선택에 하나의 테이블을 결합하는 SQL
- sql - 두 열에서 그룹 변수를 만드는 방법
OrderBy
뒤에Distinct
그all
의미 정의 된순서가 없습니다 (Distinct
물건을 주문할 수 있고 다시 주문할 수 있습니다.)이것은
Skip
그리고Take
정렬되지 않은 행 집합에 대해 작동하기 때문에 잘못 정의되어 있습니다.그래서 코드는 항상 깨졌습니다. 이제는 더 분명해졌습니다.
확실히
그 방법 중 하나는Skip
그리고Take
IOrderedEnumerable
에 대하여 일하고있다 보다 구체적으로 말하면고유로모든 행의 순서를 정의하면 코드가 잘 정의되고특정순서가 EF 코드에 반영됩니다 생성합니다.Distinct
를 제거하는 것입니다 . 다른 하나는OrderBy
에 대한 또 다른 전화 일 것입니다Distinct
후 . <시간> 와이즈 비즈 와이즈 비즈