在.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&amp; EF Core 2.0,该方法抛出此异常:
发生了System.InvalidOperationException:在类型&#39; PaperPointerRecord&#39;之间没有定义强制运算符。和PaperRecord&#39;。
此块中出现此异常:
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,我没有看到任何显示在那里的内容,表明我们在急切加载时做错了。
答案 0 :(得分:2)
Include
在这种情况下并不实用,因为您要返回投影并忽略Include
(读取有关忽略的内容包括here)。
如果通过&#34;预期结果&#34;你的意思是你希望record.PaperRecord.Paper
有一个值,只需将它包含在你的投影中; EF将把这段关系联系起来。
new
{
PaperRecord = _.Paper,
PaperPointerRecord = _,
PaperColor = _.Paper.PaperColor,
}