2010-03-15 28 views
0

我想達到以下...LINQ - Select語句 - 空值不能分配給具有類型System.Int32一個成員是一個非空的值類型

_4S.NJB_Request request = 
       (from r in db.NJB_Requests 
       where r.RequestId == referenceId 
       select r).Take(1).SingleOrDefault(); 

獲取以下例外......

Message: 
The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type. 


StackTrace: 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source) 
    at DAL.SqlDataProvider.MarkNJBPCRequestAsComplete(Int32 referenceId, Int32 processState) 

我已驗證'referenceId'是否有值。

任何人都知道爲什麼這會發生在選擇語句?

謝謝!

編輯:r.RequestId = NOT NULL詮釋,referenceId = INT

+0

你有_4S.NJB_Request類中的其他int32 fieds嗎? – BlackICE 2010-03-15 16:27:16

+0

referenceId和r.RequestId是什麼類型? – Andrey 2010-03-15 16:28:34

+0

我想你可能需要.FirstOrDefault()而不是.Take(1).SingleOrDefault() – 2010-03-15 16:29:25

回答

1

r.RequestId是否可以爲空?那麼你可以使用:

_4S.NJB_Request request = 
       (from r in db.NJB_Requests 
       where r.RequestId == (int?)referenceId 
       select r).FirstOrDefault(); 

你的dc與數據庫是否最新?也許你有一個空的數據庫被分配給一個int因爲你的模型沒有與數據庫同步

+0

@Kurresmack - RequestId不可爲空,因爲它是表的主鍵 – thiag0 2010-03-15 16:36:17

+0

您的dc是否與數據庫保持最新?也許你有一個空的數據庫被分配到一個int因爲你的模型沒有與數據庫同步 – 2010-03-15 16:40:38

+0

看起來像我的本地數據庫沒有與生產數據庫同步..感謝您的幫助先生.. – thiag0 2010-03-15 18:14:42

0

我認爲,採取電話是多餘的,保持的SingleOrDefault從節約您從異常,請嘗試使用FirstOrDefault更換取(1).SingleOrDefault:

(from r in db.NJB_Requests 
       where r.RequestId == referenceId 
       select r).FirstOrDefault(); 

編輯:將SingleOrDefault更改爲FirstOrDefault,以避免在返回多個項目時出現異常。

+0

如果列表中有更多的1個元素,則會拋出一個表達式。相反,你可以使用FirstOrDefault() – 2010-03-15 16:28:07

+0

「如果列表中有更多的1個元素,將會拋出一個表達式。」 - 然後使用FirstOrDefault 編輯:嘿,我看到你更新了你的評論,讓它看起來像你最初建議的FirstOrDefault ...更新我的內容以顯示它在我回復時的讀法。 – heisenberg 2010-03-15 16:28:32

+0

@Kurresmack&@kekekela - 將其更改爲FirstOrDefault,我仍然收到同樣的錯誤...任何其他想法? – thiag0 2010-03-15 16:33:37

相關問題