目标:
我想将来自具有不同属性的两个表(实体A 和实体B)的信息组合到一个unionDto。我正在尝试通过联合操作来实现这一点,以同时过滤数据库中的不同实体。
但是我使用的结构需要在联合查询之前需要过滤的版本。
一些附加信息:
所以我在最后一个查询中要做的是:首先我将表“entityA”和“entityB”中的信息投影到通用“匿名”类型(带有联合)。然后我尝试应用分页,然后我尝试将新的匿名结果“投影”到UnionDto。因此,这将导致一个 UnionDto 具有“来自 2 个不同表的信息”。
我用两个具有版本的实体创建了一个问题示例:
实体:
class entityA {
public List<VersionA> Versions;
public Guid CreatedBy;
}
class entityB {
public List<VersionB> Versions;
public Guid CreatedBy;
}
class VersionA {
public string TitleA;
public Instant EffectiveTo;
}
class VersionB {
public string TitleB;
public Instant EffectiveTo;
}
class UnionDto{
public string Title;
public Guid Creator;
}
我正在设置这样的查询:
var queryA = databaseContext.Set<entityA>()
.Select(entity => new
{
Versions = entity.Versions
.Where(version => version.EffectiveTo > now) /* Filtering newest entity Version */
.Select(versionDetail => new /* Selecting only the Title of this Version */
{
Title = versionDetail.TitleA
})
.ToList(),
Creator = entity.CreatedBy,
});
var queryB = databaseContext.Set<entityB>()
.Select(entity => new
{
Versions = entity.Versions
.Where(version => version.EffectiveTo > now)
.Select(versionDetail => new
{
Title = versionDetail.TitleB
})
.ToList(),
Creator = entity.CreatedBy,
});
执行查询:
var unionDto = await queryA
.Union(queryB)
.Skip(0)
.Take(20)
.Select(x => new UnionDto
{
Title= x.Versions.FirstOrDefault() == null ? null :
x.Versions.FirstOrDefault().Title,
Creator= x.Creator,
})
.ToListAsync();
似乎我无法在联合查询中使用子选择,并且出现以下错误:
设置操作:在投影中的客户端评估后放置时支持 #16243
我不知道,我必须做些什么来解决这个问题,因为我真的不想通过单独的数据库查询来处理我的所有实体。
当前使用 Ef core 版本:5.0.100-preview
现在这只是一个例子。这将需要至少 10 个实体,如果单独为每个实体完成,这将导致高数据库流量。
有任何想法吗?