2010-03-15 32 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

相关问题