Programming

Entity Framework 4 Single () vs. First () 및 FirstOrDefault ()

procodes 2020. 7. 28. 22:01
반응형

Entity Framework 4 Single () vs. First () 및 FirstOrDefault ()


단일 항목을 쿼리하는 다양한 방법과 각 항목을 사용하는 시간을 비교하는 데 어려움을 겪고 있습니다.

누구 든지이 모든 것을 비교하는 링크가 있거나 왜 서로를 사용하는지에 대한 간단한 설명이 있습니까? 아직 모르는 연산자가 더 있습니까?

감사합니다.


다음은 다양한 방법에 대한 개요입니다.

  • Find ()-기본 키로 항목을 가져 오려는 경우 항목을 찾을 수 없으면 null을 반환합니다. 데이터베이스로 가기 전에 컨텍스트를 살펴볼 것입니다 (주석에서 Yaron이 지적한 바와 같이) 동일한 컨텍스트가 살아있는 동안 동일한 엔티티를 여러 번 가져와야하는 경우 중요한 효율성 요소가 될 수 있습니다.

  • Single ()-쿼리에서 정확히 하나의 항목이 반환 될 것으로 예상하는 경우 쿼리가 정확히 하나의 항목을 반환하지 않으면 예외가 발생합니다.

  • SingleOrDefault ()-쿼리에서 0 개 또는 1 개의 항목이 반환 될 것으로 예상되는 경우 (예 : 주어진 키가있는 항목이 있는지 확실하지 않은 경우) 쿼리가 0 개 또는 하나의 항목을 반환하지 않으면 예외가 발생합니다.

  • First ()-쿼리에서 하나 이상의 항목이 반환 될 것으로 예상하지만 코드의 첫 번째 항목에만 액세스하려는 경우 (여기서는 쿼리에서 순서가 중요 할 수 있음) 쿼리가 하나 이상의 항목을 반환하지 않으면 예외가 발생합니다.

  • FirstOrDefault ()-쿼리에서 0 개 이상의 항목이 반환 될 것으로 예상하지만 코드의 첫 번째 항목에만 액세스하려는 경우 (예 : 주어진 키가있는 항목이 있는지 확실하지 않은 경우)


나는 항상 사용하는 경향이 있습니다 FirstOrDefault. 실제로 성능에 까다롭기를 원한다면 FirstOrDefaultEF에서 사용해야합니다 . 커버 아래에서 SingleOrDefault쿼리에서 top (2)을 사용하므로 기준과 일치하는 두 번째 행이 있는지 확인해야하며 그렇지 않은 경우 예외가 발생합니다. 기본적으로 SingleOrDefault쿼리에서 1 개 이상의 레코드를 반환하면 예외를 throw하려고합니다.


정말 간단 Single합니다. 단일 항목을 반환하고 하나 이상의 항목이 없으면 예외를 throw합니다. First첫 번째 항목을 반환하거나 항목이 없으면 던집니다. FirstOrDefault항목이 없을 때 첫 번째 항목을 반환하거나 기본값 ( null주어진 유형이 참조 유형 인 경우) 을 반환합니다 .

이것이 API의 동작입니다. 그러나 기본 구현에는 다른 동작이있을 수 있습니다. Entity Framework가이를 준수하는 동안 LLBLGen과 같은 O / RM도 null호출 할 때 반환 수 있습니다 First. 이는 매우 이상한 일입니다. 이것은 디자이너 IMO의 매우 이상한 결정이었습니다.


네 가지 방법은 각각 그 자리를 차지합니다. 실제로 두 가지 다른 작업 만 있습니다.

  • 첫 번째-여러 항목이 포함 된 결과 집합이 필요하면 해당 집합의 첫 번째 항목을 제공하십시오.
  • 단일-단일 결과를 기대하면 해당 항목을 알려주세요.

xxxxOrDefault () 버전은 "빈 결과 세트를 예외적 인 상황으로 생각하고 싶지 않다"고 덧붙입니다.


다른 한편으로, 이러한 방법을 다음과 같은 핵심 논리로 나눌 수 있습니다.

  • 메소드는 데이터베이스를 직접 쿼리합니다 : Single (), SingleOrDefault (), First (), FirstOrDefault ()
  • 방법도 데이터베이스에 대해 쿼리를 실행하기 전에 캐시에서 검색을 수행합니다 : 찾기 ()

일부 성능 세부 정보, 특히 두 번째 경우는 다음을 참조하십시오. https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

또한 첫 번째 그룹에서는 복잡한 쿼리를 정의 할 수 있지만 Find () 메서드를 사용하면 검색을위한 엔터티 키만 제공 할 수 있습니다.


Single ()SingleOrDefault () 는 일반적으로 ID와 같은 고유 식별자에 사용되는 반면 First () 또는 FirstOrDefault () 는 일반적으로 여러 결과를 가질 수 있지만 "Top 1" 만 원하는 쿼리에는 사용됩니다 .

결과가 반환되지 않으면 Single () 또는 First () 에서 예외가 발생하고 SingleOrDefault ()FirstOrDefault () 가 예외를 포착하여 null 또는 default (ResultDataType)을 반환합니다.

참고 URL : https://stackoverflow.com/questions/3485317/entity-framework-4-single-vs-first-vs-firstordefault

반응형