매김하고 Entity Framework

0

질문

내 모바일 앱도 검색하 테이블에서 데이터의 SQL 서버 데이터베이스에 입력됩니다. 내가 사용하여 EF 와 나를 사용하려고 매김에 대한 더 나은 성능을 제공합니다. 나는 필요한 데이터를 검색하에서의 마지막 요소이다. 그래서 만약 테이블에 있는 20 개의 행이 필요한 페이지 0,Id20,19,18,17,16 페이지 1Id15,14,13,12,11,...

이게 문제입니다:어떤 경우는 동안,사용자가"A"로 다운로드 테이블에서 데이터,사용자가"B"행 추가? 는 경우 사용자는""get0 페이지(도록 Id20, 19, 18, 17, 16), 고 사용자는"B"를 동시에 추가 행다(그래서 ID21 일),클래식 쿼리,사용자가"A"페이지 1 을 얻을 수 Id16, 15, 14, 13, 12... 그래서 다른 시간 ID16

내 코드는 것은 매우 간단하다:

int RecordsForPagination = 5; 
var list = _context.NameTable
                   .Where(my_condition)
                   .OrderByDescending(my_condition_for ordering)
                   .Skip (RecordsForPagination * Page)
                   .Take (RecordsForPagination)
                   .ToList();

물론 Page 이 int 에서 오는 프론트 엔드.

어떻게 해결할 수 있는 문제입니까?

나는 해결책을 찾지만 나는 알지 못하는 경우 그것은 완벽한 하나입니다. 용

.SkipWhile(x => x.ID >= LastID) 

.Skip (RecordsForPagination * Page)

그리고 물론 LastID 항상에서 전송되는 프런트 엔드.

당신이 생각하는 성능은 항상 좋은 이 코드는? 은 더 나은 솔루션은 무엇입니까?

entity-framework linq sql-server
2021-11-22 23:06:34
1

최고의 응답

1

의 성능에 미치는 영향에 따라 달라 집니다 크게는 SQL 인덱스 구현 및 순서에 의해 절입니다. 그러나 그렇게 많은 질문에 대해 성과에 관한 것으로 예상 결과.

Stack Overflow 는 좋은 예가 있는 볼륨의 활동 등을 얻을 때 당신의 끝에 어떤 페이지 다음 페이지의 레코드가 포함될 수 있습 페이지에서 당신을 볼 때문에 기본 레코드가 변경되었(이 게시물에 추가 되었습니다)

나이기 때문에 라이브 시스템은 일반적으로 받아들이고 어떠한 경우에는 예상 합니다. 개발자로서 우리는 감사하는 추가의 오버헤드로 유지하기 위해 노력하고 하나의 결과로 설정하고 있다는 점을 인정은 일반적으로 훨씬 낮은 값을 방지하기 위해 노력하고 같이 보이는 것이 중복 으로 당신은 반복하는 페이지입니다.

그것은 종종를 설명하기에 충분히 사용자에게 왜 이 발생합니다 많은 경우에,그들은 그것을 받아들일

는 경우 그것은 중요한 당신을 유지하는 장소에서 원래 결과로 설정,다음을 제한 쿼리 Where 절하지만,당신이 검색하는 데 필요한 중 하나의 Id 또는 타임 스탬프가에서 원래의 쿼리가 있습니다. 귀하의 경우에는 사용하려고 합니다 LastID지만,마지막 ID 하는 쿼리에는 그 자체이기 때문에 orderby 절에 영향을 미칠 것입니다.

할 수 없습니다 정말 사용 .SkipWhile(x => x.ID >= LastID) 이를 위해,기 때문에 건너뛰 는 것은 순차 프로세스에 의해 영향을 받는 순서와는 dis 종사하는 첫 번째 인스턴스는 식 평가 false면,그래서 당신의 순서에 기초하지 않는 Id의 건너뛰기는 동안 발생할 수 있습니 건너뛰는 레코드에 모두.

int RecordsForPagination = 5; 
int? MaxId = null;
...
var query = _context.NameTable.Where(my_condition);
// We need the Id to constraint the original search
if (!MaxId.HasValue)
    MaxId = query.Max(x => x.ID);

var list = query.Where(x => x.ID <= MaxId)
                .OrderByDescending(my_condition_for ordering)
                .Skip(RecordsForPagination * Page)
                .Take(RecordsForPagination);
                .ToList();

그것은 일반적으로 간단하는 필터에 의해 시점으로 알려져 있는 클라이언트에서이없는 왕복하여 컴퓨터바이러스에 의지에 따라 구현합니터링 될 수 있습니다 미만 효율적입니다.

2021-11-22 23:55:04

내 의도하지 않았을 검색하 LastID 에서 DB(기 때문에,당신이 말했듯이,이것에 의해 영향을 받을 수 Db 자). 나는 이런트 엔드 검색 0 페이지와 결과 Id20, 19, 18, 17, 16 - 프런트 엔드 검색 페이지 1 로 통과 백엔드 두 param:1 페이지고 LastID 이전 페이지의(이 경우 LastID=16)->그 결과가 될 것입니다 Id15, 14, 13, 12, 11... 그래서. 저는 영어를 완벽하지 않은 우리가 말하고 같은 것은?
user1106897

@user1106897 기술이 크리스 말라는 키 집합 매김,그리고 일반적으로 보다 훨씬 더 페이징에 의해 행하는,당신이 무엇을 이야기에 대한
Charlieface

매우 그것 또한 질문의 성능:페이징에 의해 행은 매우 비효율적으로 모든 이전 행 읽어야 합니다. 반면,페이징에 의해 키(또는 시간에 이 경우)매우 효율적이 있는 경우에는 지원하는 인덱스
Charlieface

찰리는 얼굴에 너무 감사에 대한 링크,정말 감사합니다. 내가 사용하려고 조언
user1106897

감사@Charlieface 성능 말을 더했다해야하는"것을 잊지의 성능,SkipWhile(id)문제를 해결하지 않습 순서를 변경할 경우"훌륭한 링크다!
Chris Schaller

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................