답변:
다음은 다양한 방법에 대한 개요입니다.
Find ()-기본 키로 항목을 가져 오려는 경우. 항목을 찾을 수없는 경우 null을 반환합니다. 동일한 컨텍스트가 살아있는 동안 동일한 엔티티를 여러 번 가져와야하는 경우 중요한 효율성 요소가 될 수있는 데이터베이스로 이동하기 전에 컨텍스트에서 살펴볼 것입니다 (Yaron이 주석에서 지적했듯이).
Single ()-쿼리에서 정확히 하나의 항목이 반환 될 것으로 예상하는 경우. 쿼리가 정확히 하나의 항목을 반환하지 않으면 예외가 발생합니다.
SingleOrDefault ()-쿼리에서 0 개 또는 1 개의 항목이 반환 될 것으로 예상 할 때 (즉, 주어진 키를 가진 항목이 있는지 확실하지 않음). 쿼리가 0 개 또는 1 개의 항목을 반환하지 않으면 예외가 발생합니다.
First ()-쿼리에 의해 하나 이상의 항목이 반환 될 것으로 예상하지만 코드의 첫 번째 항목에만 액세스하려는 경우 (여기에서 쿼리에서 순서가 중요 할 수 있음). 쿼리가 하나 이상의 항목을 반환하지 않으면 예외가 발생합니다.
FirstOrDefault ()-쿼리에서 0 개 이상의 항목이 반환 될 것으로 예상하지만 코드의 첫 번째 항목에만 액세스하려는 경우 (즉, 주어진 키가있는 항목이 있는지 확실하지 않음)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
나 SingleOrDefault
동안이 개 기록 (제한 2)를 쿼리한다 First
또는 FirstOrDefault
1 (한계 1)를 쿼리합니다.
나는 항상 사용하는 경향이 있습니다 FirstOrDefault
. 성능에 대해 정말 까다 롭고 싶다면 FirstOrDefault
EF에서 사용해야합니다 . Under the Cover SingleOrDefault
는 쿼리에서 top (2)을 사용합니다. 기준과 일치하는 두 번째 행이 있는지 확인해야하고 일치하는 경우 예외가 발생하기 때문입니다. 기본적으로 SingleOrDefault
쿼리가 1 개 이상의 레코드를 반환하면 예외를 throw하고 싶다고 말합니다.
FirstOrDefault
과 (와) 사이의 성능 차이를 측정 한 적이 SingleOrDefault
있습니까? 대부분의 경우 조기 최적화라고 말하고 싶습니다.
Single()
또는 SingleOrDefault()
내가 무언가를 반환 할 때이 해야 에만 존재 하나 . 내가 그렇게하는 이유는 잘못 작성된 쿼리를 작성하여 버그를 찾아 내야하는 것 이상을 반환하는 것입니다. 적어도 내 생각에 이것은 시스템의 데이터를 일관되게 유지하는 데 도움이 될 것입니다. 물론 이것은 더 느리지 만 그다지 느리지 않다고 생각하며 그 대가를 지불 할 의향이 있습니다.
매우 간단 Single
합니다. 단일 항목을 반환하고 항목이 없거나 둘 이상이면 예외를 throw합니다. First
첫 번째 항목을 반환하거나 항목이 없을 때 던집니다. FirstOrDefault
항목이없는 경우 첫 번째 항목을 반환하거나 기본값 ( null
주어진 유형이 참조 유형 인 경우) 을 반환합니다 .
이것이 API가 가져야하는 동작입니다. 그러나 기본 구현은 다른 동작을 가질 수 있습니다. Entity Framework가이를 준수하는 동안 LLBLGen과 같은 O / RM도 null
호출 할 때 반환 할 수 First
있는데 이는 매우 이상한 일입니다. 이것은 디자이너 IMO의 매우 이상하고 완고한 결정이었습니다.
Single
결과에 하나의 요소 만있을 것으로 예상한다는 것을 명확하게 표현합니다.
네 가지 방법은 각각 제자리를 가지고 있습니다. 실제로는 두 가지 다른 작업 만 있습니다.
xxxxOrDefault () 버전은 "빈 결과 집합을 예외적 인 상황으로 간주하고 싶지 않습니다."라고 덧붙입니다.
반면에 다음과 같이 핵심 논리로 이러한 메서드를 나눌 수 있습니다.
특히 두 번째 경우의 일부 성능 세부 정보는 https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3 에서 확인할 수 있습니다.
또한 첫 번째 그룹에서는 복잡한 쿼리를 정의 할 수 있지만 Find () 메서드를 사용하면 검색을위한 엔터티 키만 제공 할 수 있습니다.