......但它不是空的。
仅供参考 - 此错误存在许多线程,但我没有看到使用匿名类型的线程。
我在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。
感谢大家的帮助。
答案 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();