2012-06-12 2 views
1

나는이 쿼리 현재더 나은 linq 쿼리는 무엇입니까? .Where (crit) .FirstOrDefault() 또는 .Where (someCrit) .FirstOrDefault (someOtherCrit)?

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .Where(w => !w.IsDeleted) 
       .FirstOrDefault(w => w.Code == code); 
    } 

내가 다른 것보다 더 좋은 일 하나가되어이

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .Where(w => !w.IsDeleted && w.Code == code) 
       .FirstOrDefault(); 
    } 

를 사용하는 생각을 가지고 자 NHibernate를 사용하여 ... 리팩토링의 약간을 원하십니까? 모든 팁, 링크 또는 코드는 항상 높이 평가됩니다. 건배!

+0

둘 다 _should_ 동일한 표현식으로 변환되므로 동일한 SQL로 변환되지만 두 번째 표현식은 더 읽기 쉽습니다. – jrummell

답변

3

linq2objects에서 또는이 같은 단지 FirstOrDefault 쓸 수 linq2sql : NHibernate에 대한

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .FirstOrDefault(w => !w.IsDeleted && w.Code == code); 
    } 

확실하지 않음을하지만, 그러나 아마 작동합니다. 그리고 당신은 항상 NHProf 또는 일반 SQL 프로파일 러를 사용하여 생성 된 sql을 확인할 수 있습니다.

2

술어를 두 개의 덩어리로 나눠 혼란스럽게 보입니다. 한 곳에서 "필터링"코드를 유지하고 .Where (두 번째 예) 또는 모두 .FirstOrDefault에 넣으십시오. 후자의 옵션은보다 간결하며 더 적은 수의 연산자를 사용하므로 일반적으로 이상적입니다.

0

두 번째 기준은 두 기준 모두를 기반으로 한 투영을 수행하기 때문에 더 좋습니다. 첫 번째 기준은 첫 번째 기준에 따라 첫 번째 예상을 수행 한 다음 두 번째 기준에 따라 두 번째 예상을 적용합니다. 두 번째 방법을 사용하는 것이 좋습니다.

관련 문제