2012-06-22 2 views
0

linq 쿼리에서 예외를 처리하려면 어떻게해야합니까? 예를 들어 다음과 같은 쿼리가있는 경우 :linq 쿼리의 예외 처리

var query = (from d in GetLHDb().daily_average 
      where d.findnsave_site_id == fnsID 
        && d.test_path_id == pathId 
        && d.date > nTimesDays 
        && d.date <= yesterday 
      select new 
      { 
       loadtime = d.loadtime, 
       created_at = d.date 
      }).ToArray(); 

예를 들어, 쿼리 내에서 null 예외를 처리 할 수 ​​있습니까? 나는 온라인으로 수색을 해왔지만 그 중 많은 것들은 VB에서 사용되었다.

+0

어디에서 예외가 발생합니까? 'GetLHDb(). daily_average' 또는'd '의 변수에 접근하는 것으로부터 던져지고 있습니까? –

+0

null 예외 [s] 처리하려는 의미를 정의하십시오. –

+0

이것은 단지 하나의 예 였지만 일반적으로 결과가 비어 있으면 null 예외가 발생합니다. 나는 C# Linq에 익숙하지 않아 이런 상황을 어떻게 처리해야할지 몰랐다. – SherCoder

답변

1

코드의 다른 부분과 마찬가지입니다. .ToArray()try/catch 블록으로 마무리하십시오. 귀하의 경우에는 더 방어 적이며 null 값을 올바르게 처리 할 수 ​​있습니다. 당신의 예에서

try 
{ 
    var query = (from d in GetLHDb().daily_average 
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date >       nTimesDays && d.date <= yesterday 
select new { loadtime = d.loadtime, created_at = d.date }).ToArray(); 
} 
catch (Exception) 
{ 
    //do what you need to 
} 
+0

감사합니다. 이것은 깔끔한 해결책입니다. 그러나 try/catch 블록 외부에서 var'query' 결과를 더 사용하고자 할 때 try/catch 블록의 범위에만 있기 때문에'query'를 사용하지 않습니다. – SherCoder

+0

@SherCoder :이 경우'var' 키워드를 사용할 수 없습니다. 강력하게 쿼리 개체를 입력해야합니다. try/catch 블록 이후에, 코드가 예외를 던진 경우에 대비하여'query! = null'을 검사해야합니다. –

+0

그래서 데이터베이스에서 검색하고자하는 데이터를 보유하고있는 별도의 클래스를 생성한다고 말하고 있습니까? – SherCoder

1
try 
{ 
    var query = (from d in GetLHDb().daily_average 
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date > nTimesDays && d.date <= yesterday 
    select new { loadtime = d.loadtime, created_at = d.date }).ToArray(); 
} 
catch (NullReferenceException e) 
{ 
    ReportError(); 
} 
+0

감사하지만 위의 비슷한 대답에서 언급 한 것과 같은 문제가 있습니다. – SherCoder

1

, 난 당신이 널 참조 예외를 받고 할 수있는 세 가지 장소를보고하고, 그리고 그 GetLHDB가 null의 경우 daily_average 이상 열거하려고 GetLHDb().daily_average에 액세스이다가 null의 경우, 또는하려고 d 내 액세스 필드가 null 인 경우 ()이 경우 발생할 수있는 것인지 확실하지 않습니다.).

GetLHDb()의 결과를 로컬 변수 (예 : lhdb)에 저장 한 다음 Null을 확인하는 것이 좋습니다. null이 아닌 경우, nll check-on lhdb.daily_average을 수행하십시오. null이 아닌 경우 쿼리를 계속 진행하십시오.

업데이트 : 또한, 경우에 d가 null, 당신은 d != null으로 where 절을 시작할 수 있습니다.

var lhdb = GetLHDb(); 
if(lhdb != null && lhdb.daily_average != null) 
{ 
    var query = (from d in lhdb.daily_average 
       where d != null // If d can't be null, remove this 
         && d.findnsave_site_id == fnsID 
         && d.test_path_id == pathId 
         && d.date > nTimesDays 
         && d.date <= yesterday 
       select new 
       { 
        loadtime = d.loadtime, 
        created_at = d.date 
       }).ToArray(); 

    // Process the results 
} 
+0

이 옵션은 데이터베이스 또는 테이블이 비어 있는지 여부 만 확인합니다. 하지만 제 경우에는 그렇지 않습니다. 그러나, 나는 거기에 체크를하는 것이 여전히 좋은 습관이라고 생각한다. – SherCoder

+0

'd'가 null 인 경우에 한 절을 추가했는데, 그 부분을 반드시 따라해야한다고 생각하지 않습니다. 'daily_Average'에 행이 ​​없으면 빈 열거 형을 가져와 원래 쿼리의 결과로 빈 배열을 가져와야합니다. –