2011-08-18 103 views
1

下面的代碼假設每行都有一個簡單的統計費率平均值,但是要求規定導入的數據集允許空值。LINQ不檢查null

下面的行沒有正確地檢查值,我收到錯誤:「ArgumentNullException未被用戶代碼處理,值不能爲空。」

TUITIONCurr = g 
    .Where(p => !object.Equals(p.Field<double>("TUITION"),null)) 
    .DefaultIfEmpty() 
    .Average(p => p.Field<double>("TUITION")), 
+1

什麼是g和p。 – msarchet

+0

您是否需要移除null(或實際上是'DBNull.Value')值,或者將它們替換爲零? –

回答

1

而不是DataRow.Field方法,請嘗試使用DataRow.IsNull。此外,您不需要致電DefaultIfEmpty()

例如爲:

TUITIONCurr = g 
    .Where(p => !p.IsNull("TUITION")) 
    .Average(p => p.Field<double>("TUITION")), 
+0

Downvoter - 謹慎解釋爲什麼?如果我的答案在技術上不正確,我想提醒大家。 – Donut

2

你應該比較DBNull.Value,不null

TUITIONCurr = g 
    .Where(p => !object.Equals(p.Field<double>("TUITION"), DBNull.Value)) 
    .Average(p => p.Field<double>("TUITION")); 

一旦你過濾掉空,你不需要DefaultIfEmpty()電話。

+0

'TUITIONCurr = g.Where(p =>!object.Equals(p.Field (「TUITION」),DBNull.Value))。DefaultIfEmpty()。Average(p => p.Field (「TUITION」)) )'返回相同的原始錯誤 – sammarcow

+0

在這種情況下,這意味着其中一個'p'實際上是'null';不知道爲什麼會這樣,但是你應該將'g.ToList()'賦值給一個變量並且在調試器中檢查它以查看序列中的實際內容。 – dlev