带有子选择的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();