【发布时间】:2013-11-05 06:50:31
【问题描述】:
...但它不为空。
仅供参考 - 此错误存在许多线程,但我没有看到使用匿名类型。
我在 Linq 查询中遇到奇怪的 InvalidOperationException。
消息:“转换为值类型 '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,其他属性是 int。 另外,这段代码是几周前写的,直到今天我才收到这个错误。我的 EF 有什么时髦的东西吗?
编辑:已解决
我们在数据库中使用软删除,将删除的记录设置为 Acive=0。 事实证明,在 edmx 表上的 EF 中设置了一个属性,用于过滤掉非活动记录(针对 Active=1 的过滤器)。自然,这不会影响 Linqpad,它给了我预期的结果,但由于这是我正在测试的旧记录,标题记录 (Service.Title) 已标记为 Active=0,因此返回 null。
感谢大家的帮助。
【问题讨论】:
-
w.workstepid 表中是否有空值?或者这是模型中可以为空的类型?
-
这不能在 linqpad 中运行。第一行是非法语法。
-
LinqPad 运行 C# 5.0 - 也许它是语言中的东西
-
Good discussion 在这里。
-
你在延迟加载
Service类吗?你能告诉我们你的WorkStep班级吗?
标签: c# .net linq entity-framework c#-4.0