C# “急装”;类型之间未定义强制运算符“;.NET Core/EF Core 2.0升级后
在.NET Core 1.x中,我们有一个类似以下的方法: 公共异步任务GetOneAsync(DbSet paperPointerRecords, int?paperId=null, long?externalPaperId=null, 表达式筛选器=空) { var query=filter为null?paperPointerRecords.AsQueryable():paperPointerRecords.Where(filter); if(paperId.HasValue) query=query.Where(\u=>\ u0.PaperPointerId==paperId); if(externalPaperId.HasValue) query=query.Where(\u=>\ u0.ExternalId==externalPaperId); var record=wait query.Include(\u=>\ ux.Paper) .然后包括(=>u.PaperColors) .选择(=>new { PaperRecord=\纸张, PaperPointerRecord=_ }) .SingleOrDefaultAsync(); return!(记录为空)?(record.PaperRecord,record.PaperPointerRecord):抛出NewPaperRecordNotFoundException(paperId,externalPaperId); } 这对我们很有效。将整个项目升级到everything.NET Core 2.0和EF Core 2.0后,该方法会引发以下异常: System.InvalidOperationException发生:在类型“PaperPointerRecord”和“PaperRecord”之间未定义强制运算符 此块中出现此异常:C# “急装”;类型之间未定义强制运算符“;.NET Core/EF Core 2.0升级后,c#,linq,.net-core,entity-framework-core,eager-loading,C#,Linq,.net Core,Entity Framework Core,Eager Loading,在.NET Core 1.x中,我们有一个类似以下的方法: 公共异步任务GetOneAsync(DbSet paperPointerRecords, int?paperId=null, long?externalPaperId=null, 表达式筛选器=空) { var query=filter为null?paperPointerRecords.AsQueryable():paperPointerRecords.Where(filter); if(paperId.HasValue) query=
var-record=wait-query.Include(\u=>\ ux.Paper)
.然后包括(=>u.PaperColors)
.选择(=>new
{
PaperRecord=\纸张,
PaperPointerRecord=_
})
.SingleOrDefaultAsync();
如果我删除了渴望加载并使其如此,那么错误就会消失,但我也不会得到预期的结果:
var记录=等待查询。选择(=>new
{
PaperRecord=\纸张,
PaperPointerRecord=_
})
.SingleOrDefaultAsync();
我已经为此检查了,没有看到任何显示的内容表明我们在快速加载时出错。
Include
在这种情况下没有用处,因为您返回了一个投影,并且忽略了Include
(阅读关于忽略的Include)
如果“预期结果”是指希望record.PaperRecord.Paper
有一个值,只需将其包含在投影中即可;EF将建立起这种关系
new
{
PaperRecord = _.Paper,
PaperPointerRecord = _,
PaperColor = _.Paper.PaperColor,
}
我完全同意你的评估。我基本上按照你的建议做了,解决了这个问题。最后,代码被简化并更直接。不过,更让我担心的是,它在1.x和2.0中运行得很好,它对它提出了质疑。在某些方面,它有助于使事情变得更好。但是这种情况有点强迫,需要我们重新编写大量代码。