在.NET Core 1.x中,我们有一个看起来像这样的方法:
如果我移除了急加载并将其改为以下方式,那么错误就消失了,但是我也无法获得预期的结果:
我查看了Microsoft文档,没有显示我们在使用贪婪加载方面存在错误。
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后,该方法抛出以下异常:
System.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文档,没有显示我们在使用贪婪加载方面存在错误。