2013-08-27 1 views
5

와 기본 다음 코드는 .Single이나 조건 또는 조항

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 
    .SingleOrDefault(); 

를 Where을 제거 다음과 같이 다시 작성 될 수에게 있습니다.

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

어느 것이 더 나은 관행이고 왜 그런가? 예외가있을 경우, 이와

var temp = this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

return temp.SingleOrDefault(); 

: 함수의 리턴 값을 디버깅의 복잡성 및 디버거에서 람다 식을 사용 불가능으로

+7

생성 된 'SQL'쿼리가 동일하므로 사용자 의견이 더 좋다고 말할 수 있습니다. – MarcinJuraszek

+1

두 번째는 짧고 여전히 읽기 쉽습니다. –

+3

첫 번째 코드는 단계별 코드를 따르고 확장/디버그하기가 더 쉽다고 생각합니다. –

답변

1

먼저 차이를 이해할 필요가

,
this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 

이 경우 쿼리가 생성되지만 ToList 메서드를 호출 할 때까지 실행되지 않습니다.

SingleOrDefault 메서드는 실제로 쿼리를 실행합니다. 따라서 쿼리가 실행되기 전에 쿼리를 확인하거나 수행하려는 경우 Where를 사용하고 SingleOrDefault를 호출해야합니다.

그래서 전반적으로 사용 어디에 내 개인적인 의견

2

덕분에,이 최선의 방법 SingleOrDefault() (복잡한 표정을하고 있다면 매우 일반적인 일이), 당신은 return에 중단 점을 넣고 시계 패널에서 수행 할 수 있습니다 모든 temp.ToList();

+3

모든 점을 고려하여 생각해보십시오. – Maarten

+1

@Maarten 직접 경험이라고 부르겠다 :-) 내 코드는 검증 할 수있는 장점을 가지고 있기 때문에 OP에서 제안한 두 가지 버전보다 낫다. 결과 코드는 OP (IL 수준에서) 중 하나와 동등/거의 동일하지만, 똑같이 읽을 수 있고 디버그하기 쉽습니다. – xanatos

0

이전 게시물 당 좋은 방법이며, 이는 대부분의 의견 기반이지만, 여기에 있지 위에서 언급 한 또 다른 고려 사항이다 :

SingleOrDefault 절은 될 수 없다 위의 Patel 노트에서 실제로 쿼리를 실행하기 때문에 Select과 같은 다른 용어가 뒤 따른다. 예를 들어 당신이 바로 고객의 이름을 반환하는 쿼리를 수정할 길을 ​​말 :

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name); //compile error 

이 작동하지 않습니다, 당신은 SingleOrDefault 이전에 Select 절을 이동할 수 없습니다 다음 IdCustomerType 때문에 필드는 SingleOrDefault의 람다 표현식에 표시되지 않습니다. 대신 먼저 Where 절을 다시 추가해야 할 것 :

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name) 
.SingleOrDefault(); 

Where 절은 종종 항상 적어도 좋은 성능 필요하며, 따라서 때문에 항상 일관성을 위해 그것을 사용하는 아마 좋은 방법이며, 가독성, 유지 보수성.