如何解决带有子选择的EF Core 5.0 Union Linq查询不起作用
目标:
我想将来自具有不同属性的两个表(entityA和entityB)中的信息组合到一个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(),});
执行查询:
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核心版本:5.0.100-预览
现在这只是一个例子。至少需要10个实体,这是必需的,如果分别对每个实体进行操作,则会导致数据库流量较高。
有什么想法吗?
解决方法
如果只需要每个记录集的第一版标题,则可以简化查询,EF Core可以翻译该查询。
var queryA =
from entity in databaseContext.Set<entityA>()
from version in entity.Versions
where version.EffectiveTo > now
select new
{
Title = version.Title,Creator = entity.CreatedBy
}
var queryB =
from entity in databaseContext.Set<entityB>()
from version in entity.Versions
where version.EffectiveTo > now
select new
{
Title = version.Title,Creator = entity.CreatedBy
}
var versions = queryA.Union(queryB);
var unionDto = await versions
.Skip(0)
.Take(20)
.Select(x => new UnionDto
{
Title = x.Title,Creator = x.Creator,})
.ToListAsync();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。