2011-09-20 6 views
0

저는 linq을 처음 사용 했으므로이 왼쪽 조인 쿼리를 사용하는 데 도움을 주셔서 감사합니다.LINQ로 왼쪽 조인 오류

나는 "var hourlyData"(집계 된 데이터가 들어있는 처리 된 linq 쿼리)와 결합하기를 원하는 "List hours"(시간 0-23의 목록)를 가지고 있습니다. 왼쪽 조인에서 내 시도는 "var reportData"입니다.

예외 정보 : System.NullReferenceException : 개체의 인스턴스로 설정되지 않았습니다 개체 참조

DataSet ds = GetDataSet(sSql); 
var stats = ds.Tables[0].AsEnumerable(); 

var hourlyData = from stat in stats 
       group stat by stat.Field<int>("Hour") into g 
       select new 
       { 
        Hour = g.Key, 
        Value = g.Key.ToString(), 
        D1 = g.Sum(stat => stat.Field<int>("D1")), 
        D2 = g.Sum(stat => stat.Field<int>("D2")), 
        D3 = g.Sum(stat => stat.Field<decimal>("D3")) 
       }; 


List<int> hours = new List<int>(); 
for (int i = 0; i < 24; i++) 
{ 
    hours.Add(i); 
} 


var reportData = from hour in hours.AsEnumerable() 
       join stat in hourlyData.AsEnumerable() 
        on hour equals stat.Hour 
       into sts2 
       from stat2 in sts2.DefaultIfEmpty() 
       select new 
       { 
        Hour = hour, 
        Value = hour, 
        D1 = stat2.D1 != null ? stat2.D1 : 0, 
        D2 = stat2.D2 != null ? stat2.D2 : 0, 
        D3 = stat2.D3 != null ? stat2.D3 : 0 
       }; 

은 위의 코드는이 오류가 발생합니다.

소스 오류 :

Line 135:       into sts2 
Line 136:       from stat2 in sts2.DefaultIfEmpty() 
Line 137:       select new 
Line 138:       { 
Line 139:        Hour = hour, 
... 

감사합니다!

+0

: 이러한 경우에, 당신은 당신의 선택 성명에서 D1, D2, D3 및 할당을해야합니다 제정신 기본값 경우는 null가 있습니다. 아마도 이것은 더 많은 통찰력을 제공합니다 : [NullReferenceException : 객체 참조가 객체의 인스턴스로 설정되지 않았습니다.] _Ch. b__b 을 System.Linq에서 (<> f__AnonymousType1'2 <> h__TransparentIdentifier0 <> f__AnonymousType0'5 stat2). d__31'3.MoveNext() 303 System.Collections.Generic.List'1..ctor (IEnumerable'1 컬렉션) +327 System.Linq.Enumerable.ToList (IEnumerable'1 원본) +58 – mike

+0

실제 코드는 ToList() 호출에서 예외를 throw하고 있습니다. 이 후에 어떤 코드가 있습니까? 또한 가독성을 위해 데이터 테이블을 제외하고 모든 AsEnumerable() 호출을 제거 할 수 있으며 시간 설정은 간단히 'var hours = Enumerable.Range (0,24)'가 될 수 있습니다. –

+0

도움과 .range 바로 가기를 보내 주셔서 감사합니다 ! 간단한 대답은 "D1 = stat2.D1! = null? stat2.D1 : 0, ..."을 "D1 = stat2! = null? stat2.D1 : 0,"으로 변경하는 것입니다. – mike

답변

0

. 난 여전히 오류를 받고 있어요

D1 = stat2 != null ? stat2.D1 : 0, 
D2 = stat2 != null ? stat2.D2 : 0, 
D3 = stat2 != null ? stat2.D3 : 0, 
+0

위의 코드는'var hourlyData'를 가지고 있지만 조인 절에는 hourlyStats.DefaultIfEmpty()에 join stat가 있습니다. 다른 데이터 세트를 다른 곳에서 사용하고 있습니까? – doctorless

+0

"var stats = ds.Tables [0] .AsEnumerable();" 데이터는 SQL 데이터베이스에서 가져온 것입니다. var hourlyData는 해당 통계 테이블에서 집계 함수를 수행합니다. – mike

+0

맞아.하지만 var reportData = 시간을 시간으로 봐 .AsEnumerable() 시간당 통계를 합치면 .AsEnumerable()'. 'hourlyData'가 아닌'hourlyStats'가 있습니다. – doctorless

0

왼쪽 결합을 수행하고 stat2가 null 일 수 있으므로 null 일 수있는 경우를 처리해야합니다.

시도

select new 
{ 
    Hour = hour, 
    Value = hour, 
    D1 = stat2 != null ? stat2.D1 : 0, 
    D2 = stat2 != null ? stat2.D2 : 0, 
    D3 = stat2 != null ? stat2.D3 : 0 
}; 

참고 : 0 귀하의 경우에는 적절하지 않을 수 있습니다; 적절한 것을 사용하십시오.

관련 문제