Linq错误:转换为值类型“Int32”失败,因为实现值为null

时间:2013-11-05 06:50:32

标签: c# .net linq entity-framework c#-4.0

......但它不是空的。

仅供参考 - 此错误存在许多线程,但我没有看到使用匿名类型的线程。

我在Linq查询中遇到奇怪的InvalidOperationException。

message:“转换为值类型'Int32'失败,因为具体化值为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,其他属性是整数。 此外,这段代码是几周前编写的,直到今天我都没有收到此错误。我的EF是时髦的吗?

修改:已解决

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

感谢大家的帮助。

4 个答案:

答案 0 :(得分:0)

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值。希望这有帮助

答案 1 :(得分:0)

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

int? workstepid = 484449;

答案 2 :(得分:0)

我想,问题出在你的SingleOrDefault()。

我想你得到0条记录:

var workstepid = 484,449;

var len = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Length();

然后anonymouse类型必须被Default替换(这是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();

答案 3 :(得分:0)

可能在某处没有Service / Title / Order id,但如果它声明为int匿名类型expect int(不可为空),但是从数据库返回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();