gpt4 book ai didi

c# - 带有子选择的 EF Core 5.0 联合 Linq 查询不起作用

转载 作者:行者123 更新时间:2023-12-05 02:48:55 25 4
gpt4 key购买 nike

目标:

我想将两个具有不同属性的表(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(),
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();

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

Set operations: support when placed after client evaluation inprojection #16243

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

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

现在这只是一个例子。这将需要至少 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();

关于c# - 带有子选择的 EF Core 5.0 联合 Linq 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com