在里面NET Core 1。x、 我们有这样一种方法:
public async Task<(PaperRecord Component, PaperPointerRecord Pointer)> GetOneAsync(DbSet<PaperPointerRecord> paperPointerRecords,
int? paperId = null,
long? externalPaperId = null,
Expression<Func<PaperPointerRecord, bool>> filter = null)
{
var query = filter is null ? paperPointerRecords.AsQueryable() : paperPointerRecords.Where(filter);
if (paperId.HasValue)
query = query.Where(_ => _.PaperPointerId == paperId);
if (externalPaperId.HasValue)
query = query.Where(_ => _.ExternalId == externalPaperId);
var record = await query.Include(_ => _.Paper)
.ThenInclude(_ => _.PaperColors)
.Select(_ => new
{
PaperRecord = _.Paper,
PaperPointerRecord = _
})
.SingleOrDefaultAsync();
return !(record is null) ? (record.PaperRecord, record.PaperPointerRecord) : throw NewPaperRecordNotFoundException(paperId, externalPaperId);
}
这对我们来说非常有效。在将整个项目升级到所有内容之后。NET Core 2.0和;EF Core 2.0中,该方法引发此异常:
系统发生InvalidOperationException:在类型“PaperPointerRecord”和“PaperRecord”之间未定义强制运算符。
var record = await query.Include(_ => _.Paper)
.ThenInclude(_ => _.PaperColors)
.Select(_ => new
{
PaperRecord = _.Paper,
PaperPointerRecord = _
})
.SingleOrDefaultAsync();
如果我删除了即时加载并这样做,那么错误就会消失,但我也没有得到预期的结果:
var record = await query.Select(_ => new
{
PaperRecord = _.Paper,
PaperPointerRecord = _
})
.SingleOrDefaultAsync();
我已经查过了
Microsoft Documentation