2012-05-18 3 views
1

나는 다음과 같이 DB 테이블에 합성 쿼리를 작성하고자 : 빈 컬렉션에서 집계 연산자를 사용하여 Linq 예외를 피하는 방법은 무엇입니까?

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0)); 

는 불행하게도에서 오류가 발생하면 절은 전혀 요소를 반환하지 곳. 사용하기 전에. 내가 몇 가지 요소가 있지만 결과 코드가 초기 코드와 추악한 지 확인해야합니다. try/catch 블록을 넣는 것이 좋은 해결책이라고 생각하지 마십시오.

다음 코드를 제안 할만한 것이 있습니까?

추가 좀 더 조사 후

if (MyDataContext.MyTable.Where(el => el.Client == selectedClien).Any()) 
    sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0)); 
else sum = 0; 

감사 필리포 : 컬렉션이 비어있을 때

MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0) 

위의 코드는 잘 작동합니다. 내가 'GetValueOrDefault (0)'을 .Sum() 내부의 람다에 넣는 이유는 'Value'필드가 Decimal?이므로 null 일 수 있습니다. 일부 요소에 null 값이있는 경우를 아직 테스트하지 않았습니다.

+2

요소가 없으면 Sum은 0을 반환합니다. Average와 같은 다른 연산자는 문제가있을 수 있지만 Sum은 괜찮을 것입니다 ... –

+0

'Where = '뒤에'Value = 0'을 사용하여 더미 요소를 추가 할 수 있습니다. 합계는 변경되지 않지만 다른 요소가 없으면 '0'을 반환합니다. – phg

+0

"불행히도 where 절이 아무런 원소도 반환하지 않으면 오류가 발생합니다."-이 오류에 대해 더 자세히 알려주십시오. – AakashM

답변

0

놀랍게도 (필자에게) 나는 내 코드를 더욱 강력하게 만들려고 가능한 예외적 인 원인을 소개했다. 이상과

Enumerable.Sum<TSource> Method (IEnumerable<TSource>, Func<TSource, Nullable<Decimal>>) 

가 null 값과 빈 컬렉션에 강하다는 MSDN 설명서에 코멘트에 명시된 바와 같이

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0); 

: 강력한 코드를 작성하는 올바른 방법은 다음과 같다. GetValueOrDefault()는 10 진수가 아닌 null을 반환하도록합니다.

어쨌든 초기 코드가 예외를 throw하는 이유는 아직 명확하지 않습니다.

1

나는 그것을 피하기 위해 확장 기능을 작성했습니다.

public static decimal? SafeSum<T>(this IEnumerable<T> source, Func<T, decimal?> selector) 
    { 
     try 
     { 
      return source.Sum(selector); 
     } 
     catch 
     { 
      /* ignore exception */ 
      return null; 
     } 
    } 
+0

이것은 피하고 싶습니다 try/catch 블록을 숨기는 방법입니다. – Filippo

+1

(a) 컴파일되지 않습니다. (b)'Sum'이 예외를 던집니다. 왜냐하면'source'는 빈 열거 형이므로 _not_입니다. 이것은 실제 문제가 무엇이든간에 그냥 가릴 것입니다. – Rawling

+0

@Rawling 컴파일 오류를 수정했습니다. 감사합니다. 제공된 코드는 예외이므로 예외를 피하기위한 것입니다. 강력한 코드가 필요한 경우 예외를 확실하게 기록 할 수 있다고 생각합니다. –

관련 문제