C# Linq错误:转换为值类型';Int32';由于物化值为null,因此失败

C# Linq错误:转换为值类型';Int32';由于物化值为null,因此失败,c#,.net,linq,entity-framework,c#-4.0,C#,.net,Linq,Entity Framework,C# 4.0,。。。但它不是空的 仅供参考-此错误上存在许多线程,但我从未见过使用匿名类型的线程 我在Linq查询中遇到一个奇怪的InvalidOperation异常 消息:“转换为值类型“Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为null的类型。” 令人困惑的是,它在创建匿名类型时出错: var workstepid = 484,449; var wsData = ion.xWorkSteps .Where(w => w.WorkStepId == wor

。。。但它不是空的

仅供参考-此错误上存在许多线程,但我从未见过使用匿名类型的线程

我在Linq查询中遇到一个奇怪的InvalidOperation异常

消息:“转换为值类型“Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为null的类型。”

令人困惑的是,它在创建匿名类型时出错:

var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
       w.WorkStepId,
       w.ServiceId,
       w.Service.TitleId,
       w.Service.Title.OrderId,
       w.Service.Title.AltTitleId
   }).SingleOrDefault();
在LinqPad中,这个特定的查询运行得很好,所使用的workstepId为匿名类型的每个属性返回一个整数值。那么,当任何属性都没有空值时,为什么会出现强制转换错误呢

仅供参考,最后一个属性AltTitleId是可为空的int,其他属性是int。 另外,这段代码是几周前写的,直到今天我才发现这个错误。我的EF有什么古怪的东西吗

编辑:已解决

我们在数据库中使用软删除,将已删除的记录设置为Acive=0。 事实证明,在edmx表的EF中设置了一个属性,用于过滤非活动记录(filter for Active=1)。当然,这不会影响Linqpad,它会给我预期的结果,但由于这是我正在测试的一条旧记录,因此标题记录(Service.title)被标记为Active=0,因此返回null

谢谢大家的帮助

var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
      w.WorkStepId.Value,
      w.ServiceId.Value,
      w.Service.TitleId.Value,
      w.Service.Title.OrderId.Value,
      w.Service.Title.AltTitleId.Value
   }).SingleOrDefault();

您好,您需要在int数据类型中添加.Value以接受null值。希望这能有所帮助

如果
w.WorkStepId
可为空,请尝试将变量设置为

int? workstepid = 484449;

我想问题出在你的SingleOrDefault()中

我假设您得到0条记录:

var workstepid = 484,449;

var len = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Length();
然后,默认情况下必须替换匿名类型(SingleOrDefault就是这么做的),但匿名类型没有默认值

尝试将其更改为:

    var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
       w.WorkStepId,
       w.ServiceId,
       w.Service.TitleId,
       w.Service.Title.OrderId,
       w.Service.Title.AltTitleId
   })
   .Take(1)
   .ToArray();

可能某处并没有服务/标题/订单id,但若它声明为int匿名类型,则除int外(不可为null),但从数据库返回null。 尝试重写为:

var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
     WorkStepId = (int?)w.WorkStepId,
     ServiceId = (int?)w.ServiceId,
     TitleId = (int?)w.Service.TitleId,
     OrderId = (int?)w.Service.Title.OrderId,
     w.Service.Title.AltTitleId
   }).SingleOrDefault();

w.workstepid的表中是否有空值?或者这是模型中的可空类型?无法在linqpad中运行。第一行是非法语法。LinqPad运行C#5.0-可能是这里的语言中的某些东西。您是否懒惰地加载
服务
类?您能否向我们展示您的
工作步骤
类?可以为AltTitleId添加“.Value”,但不能为另一个添加“.Value”(AltTitleId是唯一可为空的FYI)。新的编译错误:错误231'AnonymousType#1'不包含'AltTitleId'的定义,并且找不到接受'AnonymousType#1'类型的第一个参数的扩展方法'AltTitleId'。(您是否缺少using指令或程序集引用?)您能否显示使用wsdata的代码,这可能就是错误所在。