带有子选择的 EF Core 5.0 Union Linq 查询不起作用

Cem*_*ici 3 c# linq postgresql entity-framework-core ef-core-5.0

目标:

我想将两个具有不同属性的表(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;
}
Run Code Online (Sandbox Code Playgroud)

我正在设置这样的查询:

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,
                });
Run Code Online (Sandbox Code Playgroud)

执行查询:

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();
Run Code Online (Sandbox Code Playgroud)

似乎我无法在联合查询中使用子选择,并且收到以下错误:

设置操作:支持在投影中的客户端评估之后放置#16243

我不知道我必须做什么来解决这个问题,因为我真的不想用单独的数据库查询单独遍历我的所有实体。

目前使用的Ef core版本:5.0.100-preview

现在这只是一个例子。至少 10 个实体需要这样做,如果单独为每个实体执行此操作,将导致较高的数据库流量。

有任何想法吗?

Svy*_*liv 5

如果您只需要每个记录集中第一个版本的标题,则可以简化您的查询,并且 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();
Run Code Online (Sandbox Code Playgroud)