2011-09-20 94 views
0

我是新來的LINQ這樣會感謝你的幫助,得到這個左連接的查詢工作。LEFT JOIN與LINQ錯誤

我有「的名單小時」,我想留下「VAR hourlyData」(含彙總數據的處理的LINQ查詢)加入(一小時0-23列表)。我在左連接的嘗試是「var reportData」。

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 
       }; 

上面代碼此錯誤:

異常詳細信息:System.NullReferenceException:未設置爲一個對象的實例對象引用。

源錯誤:

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

謝謝!

+0

我仍然收到錯誤消息。也許這提供了更多的見解:[NullReferenceException:對象引用未設置爲對象的實例。] _Ch。 System.Linq。 d__31'3.MoveNext()+303 System.Collections.Generic.List'1..ctor(<> f__AnonymousType1'2 <> h__TransparentIdentifier0,<> f__AnonymousType0'5 stat2)in (IEnumerable'1集合)327 System.Linq.Enumerable.ToList(IEnumerable'1源)58 – mike

+0

實際代碼在ToList()調用拋出異常。這之後有沒有任何代碼?你也可以去掉所有的'AsEnumerable()'調用,除了在數據表的可讀性和你的時間設定可能僅僅是'變種小時= Enumerable.Range(0,24)' –

+0

感謝您的幫助和.range快捷方式!簡單的答案是將「D1 = stat2.D1!= null?stat2.D1:0,...」更改爲「D1 = stat2!= null?stat2.D1:0」。 – mike

回答

0

它給你一個NRE因爲sts2.DefaultIfEmpty()的返回null。在這些情況下,您需要在您的select語句中使D1,D2和D3分配具有默認值,如果爲null:

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

我注意到上面有'var hourlyData',但是在你的連接子句中,你有'在hourlyStats.DefaultIfEmpty()'中加入stat。您是否在其他地方使用其他數據集? – doctorless

+0

「var stats = ds.Tables [0] .AsEnumerable();」是從數據庫中提取的數據。 var hourlyData在該統計表上執行聚合函數。 – mike

+0

權,但看你的'VAR reportData =從小時hours.AsEnumerable() 在hourlyStats.AsEnumerable加入STAT()'。它說'hourlyStats',而不是'hourlyData' – doctorless

0

既然你都做了左連接和STAT2可以爲空,你將不得不面對它可以爲空的情況。

嘗試

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可能不是你的情況適當的;使用適當的東西。