LINQ - Select语句 - 无法将null值分配给类型为System.Int32的成员,该成员是非可空值类型

时间:2010-03-15 16:23:59

标签: linq

我正在努力实现以下目标......

 _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'确实有值。

任何人都知道为什么会在select语句中发生这种情况?

谢谢!

编辑:r.RequestId = NOT NULL Int,referenceId = int

2 个答案:

答案 0 :(得分:1)

r.RequestId可以为空吗?然后你会使用:

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

您的DC是否与数据库保持同步?也许你在数据库中有一个空值被分配给一个int,因为你的模型没有与数据库同步

答案 1 :(得分:0)

我认为Take调用是多余的,并且让SingleOrDefault不会将您从异常中保存起来,尝试用FirstOrDefault替换Take(1).SingleOrDefault:

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

编辑:将SingleOrDefault更改为FirstOrDefault,以避免在返回超过1个项目时出现异常。