>

SQL 서버는 EF .First() 를 번역 할 수 있습니다  기능 TOP(1) 사용 . 그러나 Entity Framework의 .Last() 를 사용할 때  함수에서 예외가 발생합니다. SQL Server는 명백한 이유로 이러한 기능을 인식하지 못합니다.

내림차순으로 정렬하고 첫 번째 해당 줄을 가져 와서 문제를 해결했습니다.

var v = db.Table.OrderByDescending(t => t.ID).FirstOrDefault(t => t.ClientNumber == ClientNumberDetected);

이것은 단일 쿼리로 수행하지만 쿼리하기 전에 전체 테이블 (백만 행)을 정렬합니다 ...

이 기술을 악용하면 속도 문제가 있다고 생각할만한 이유가 있습니까?

유사한 것이 있다고 생각했지만 ... 두 가지 쿼리가 필요합니다 :

int maxID_of_Client = db.Where(t => t.ClientNumber == ClientNumberDetected).Max(t => t.ID);
var v = db.First(t => t.ID == maxID_of_Client);

클라이언트의 최대 ID를 검색 한 다음이 ID를 사용하여 클라이언트의 마지막 행을 검색합니다.

두 번 쿼리하는 것이 더 빠르지 않은 것 같습니다 ...

수백만 개의 데이터를 정렬하지 않고이를 최적화하고 단일 쿼리를 사용하는 방법이 있어야합니다.

내가 이해하지 못하는 것이 없다면, 나는이 문제에 대해 처음으로 생각하지 않았으며 그것을 위해 그것을 해결하고 싶다!

미리 감사합니다.


  • 답변 # 1

    이 질문을 주도하는 가정은 주문 절이없는 결과 집합이 예측 가능한 순서로 DB에서 다시 나온다는 것입니다.

    실제로 SQL에서 나온 결과 집합에는 암시적인 순서가 없으며 어떤 것도 가정해서는 안됩니다.

    따라서 결과는

    db.Table.FirstOrDefault(t => t.ClientNumber == ClientNumberDetected)
    
    

    실제로 결정되지 않았습니다.

    어쨌든 주문을하지 않고 처음 또는 마지막을 복용하든 아무 의미가 없습니다.

    이제 LINQ에 주문 절을 추가하면 SQL은 어떻게됩니까? 그것은 비슷한 것입니다 ...

    SELECT TOP(1) something FROM somewhere WHERE foo=bar ORDER BY somevalue
    
    

    또는 내림차순/마지막 경우

    SELECT TOP(1) something FROM somewhere WHERE foo=bar ORDER BY somevalue DESC
    
    

    SQL의 POV와는 큰 차이가 없으며 DB는 이러한 종류의 쿼리에 최적화됩니다. 색인은 어느 방향 으로든 스캔 할 수 있으며 위의 각 쿼리 비용은 동일합니다.

    TL;DR:

    db.Table.OrderByDescending(t => t.ID)
            .FirstOrDefault(t => t.ClientNumber == ClientNumberDetected)
    
    

    괜찮아.

관련 자료

  • 이전 windows installer - WiX가 Notesini 파일의 권한을 변경합니까?
  • 다음 python - gae - 스레드 및/또는 인스턴스간에 컨텍스트를 공유하는 방법