[.net] Entity Framework 4 Single () 대 First () 대 FirstOrDefault ()

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

누구든지이 모든 것을 비교하는 링크가 있습니까? 아니면 왜 다른 것을 사용하는지에 대한 빠른 설명이 있습니까? 내가 알지 못하는 운영자가 여전히 더 있습니까?

감사합니다.



답변

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

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

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

  • SingleOrDefault ()-쿼리에서 0 개 또는 1 개의 항목이 반환 될 것으로 예상 할 때 (즉, 주어진 키를 가진 항목이 있는지 확실하지 않음). 쿼리가 0 개 또는 1 개의 항목을 반환하지 않으면 예외가 발생합니다.

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

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


답변

나는 항상 사용하는 경향이 있습니다 FirstOrDefault. 성능에 대해 정말 까다 롭고 싶다면 FirstOrDefaultEF에서 사용해야합니다 . Under the Cover 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 ()
  • 메서드는 데이터베이스에 대해 쿼리를 실행하기 전에 캐시에서 검색을 수행합니다 . Find ()

특히 두 번째 경우의 일부 성능 세부 정보는 https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3 에서 확인할 수 있습니다.

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


답변

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

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


답변