2012-10-29 56 views
1

我有類似於SQL語句返回null空值。短小精悍的的SingleOrDefault(DATEDIFF(...))

在小巧玲瓏的,我通過執行此:

value = conn.Query<int>("...").SingleOrDefault()

在這種情況下,我期望的SingleOrDefault語義表示「如果這是null,則返回零。」事實上,我的代碼更是爲零友好:

int toReturn = 0; 
using (var conn = ...) { 
    toReturn = conn.Query<int>("SELECT DATEDIFF(...))"); 
} 
return toReturn; 

當我調試,並踏進這個代碼,我發現該行yield return (T)func(reader)拋出一個空指針異常。

我在這裏做錯了什麼,或者是由設計?

(僅供參考,解決辦法是換行我選擇在ISNULL(..., 0)

+0

你也可以使用c#'? 0'合併操作員以在零的情況下提供零。 http://weblogs.asp.net/scottgu/archive/2007/09/20/the-new-c-null-coalescing-operator-and-using-it-with-linq.aspx – RThomas

+0

我可以檢查:你是否談論您返回零行的情況?或者一個行返回null的情況? –

+0

@MarcGravell返回的行爲null的情況。不是零行。 – ashes999

回答

2

在數據不具有任何專案編號記錄的情況下,SQL Server返回NULL。

Data沒有任何匹配記錄的情況下,SQL服務器並不真正返回空 - 它不返回任何行。這種情況下工作正常:

var result = connection.Query<int>(// case with rows 
"select DATEDIFF(day, GETUTCDATE(), @date)", new { date = DateTime.UtcNow.AddDays(20) }) 
.SingleOrDefault(); 
result.IsEqualTo(20); 

result = connection.Query<int>(// case without rows 
    "select DATEDIFF(day, GETUTCDATE(), @date) where 1 = 0", new { date = DateTime.UtcNow.AddDays(20) }) 
    .SingleOrDefault(); 
result.IsEqualTo(0); // zero rows; default of int over zero rows is zero 

這兩個工作正常。您說ISNULL「修復」這一事實意味着您正在討論不同的場景 - 「我返回的行」場景。既然如此,你的代碼所說的是「把這個1或更多的整數包含一個null,並將它映射爲一個不可爲空的int」 - 是不可能的,並且映射器是正確的拋出異常。相反,你想要的是:

int? result = connection.Query<int?>(...).SingleOrDefault(); 

現在,如果有行,它的值映射到int?,並然後申請單或默認。你想要的是一個int,那麼也許:

int result = connection.Query<int?>(...).SingleOrDefault() ?? 0; 

如果你需要能夠告訴「零排」和「零結果」之間的區別,那麼我建議:

class NameMe { 
    public int? Value {get;set;} 
} 
var row = connection.Query<NameMe>("select ... as [Value] ...", ...) 
        .SingleOrDefault(); 
if(row == null) { 
    // no rows 
} else if(row.Value == null) { 
    // one row, null value 
} else { 
    // one row, non-null value 
} 

或類似的東西

+0

所以這是設計,然後呢? – ashes999

+0

@ ashes999絕對!你的sql代碼是**返回null **。你不能將一個null映射到一個'int'中,因此這個錯誤。如果獲取第一行的實際步驟無效,那麼'SingleOrDefault'沒有意義。我會建議:「不返回行」 - 如果你這樣做,它會很好。但是返回一個'null'並要求它將它推入一個不可爲空的'int'中......這樣的工作怎麼樣?但是,如果您將其更改爲「查詢(...)',那麼它將*工作。在'int?'中表示'null'是完全可能的 –

+0

好吧,我的不好。我期望「SingleOrDefault」意味着「在任何奇怪的條件下(沒有行,空等)返回默認值(0)」。感謝您審查設計,並解釋它:) – ashes999

相關問題