2012-05-25 31 views
3

如果我想使用Dapper獲得一堆包含單個列int的行,並且此結果集可能爲空。使用Dapper查詢這些數據的最佳方法是什麼?如何使用dapper獲得可空int []?

例如,如果我有以下方法,返回我想要什麼:

public void int[] GetInts() 
{ 

    conn.Query<int?>("select 123 where 1=1") 
     .Where(x=> x.HasValue) 
     .Select(x => x.Value) 
     .ToArray(); 
} 

如果我改變行這樣的:

conn.Query<int>("select 123 where 1=0").ToArray(); 

我得到一個鑄造錯誤時,有沒有結果。

堆棧跟蹤低於和例外是鑄造(T)next時不設置到對象的實例是一個對象引用:

at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in .\SqlMapper.cs:line 611 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)  
    at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in .\SqlMapper.cs:line 539 
+0

什麼是例外?堆棧跟蹤? –

+1

這兩個示例都不是可編譯的代碼。你能否確保兩者都是你嘗試過的? ('x => v.Value'有一個錯字,'.Query '與'x.HasValue'一起使用也不合法)。你的Dapper版本的當前版本是多少? –

+0

@KirkWoll今天剛剛更新了Dapper,以確保它不是版本問題。 – scottm

回答

0

我的問題竟然是我在做代碼中的LEFT JOIN,但是當我試圖重現錯誤時我使用了INNER JOIN,所以我無法重現相同的行爲。使用LEFT JOIN,返回值爲NULL的單個行就是爲什麼我得到NULLint之間的鑄造錯誤。

0

那麼,WhereSelect不作任何意義,如果它是一個INT。很確定你想刪除它們。

conn.Query<int>("select 123 where 1=0") 
    .ToArray(); 

當你這樣做時你有什麼問題嗎?

+0

是的,這是問題所在。如果我將泛型類型的參數改爲「int?',我可以過濾出沒有值的類型(這些都是它們)。 – scottm

+0

如果查詢實際返回值爲'null',那麼您需要讓代碼看起來像您的第一個片段。它出什麼問題了?爲什麼改變它? – Servy

+0

返回0行,不是具有'null'的行。如果我將參數更改爲'int?',則會使用'.Count()== 1'獲取'IEnumerable ',而'object'爲'null'。 – scottm

相關問題