gpt4 book ai didi

c# - 基于外键连接两个查询

转载 作者:行者123 更新时间:2023-11-30 17:54:56 26 4
gpt4 key购买 nike

我(至少在尝试)在我的 .NET C# 项目中实现 Repository pattern,所以当我需要与数据库通信时,我会使用如下方式:

IList<Sole> soles = SoleService.All().ToList();

正如上面查询所建议的从服务调用的方法的名称,我从 Sole 表中获取所有记录。我不想而且我认为这是实现此模式的正确方法,以在我的服务中保留过多的自定义逻辑。我的意思是我只想保留 All() 方法和在服务方法之外对结果进行的每次修改。

目前的问题是这样的。我有实体 Sole 和实体 SoleColorSoleColor 有一个外键列 SoleID 建立两个表之间的关系。现在,对于这两个实体,我只能调用 All() 方法:

var soleColors = SoleColorService.All();
var soles = SoleService.All();

但在这里我需要一些定制,只选择 Sole 中与 SoleColor 实体相关的那些行。换句话说,最终只列出 Sole 中的那些行,其中 Sole.ID 可以作为 SoleColor SoleID 外键中的外键找到。

现在我有点困惑 - 自从我上次使用纯 SQL 语法以来已经有一段时间了。我认为这可以使用 SQL 和 JOIN 轻松实现。但是当涉及到 LINQ 时,我的经验告诉我,我需要这两个查询:

var soleColors = SoleColorService.All();
var soles = SoleService.All();

然后进行某种 JOIN/UNION 以仅过滤我需要的结果。

那么在这种情况下我需要使用哪些工具,因为它不是我唯一需要它的地方,我想自己学习,当然在当前情况下这样做?

最佳答案

在您最后发表评论后,我认为这就是您要找的内容:

from s in SoleService.All()
join sc in SoleColorService.All() on s.ID equals sc.SoleID
select s

但这仅在两个存储库具有相同的上下文实例时才有效。如果没有,则必须分两步完成:

var ids = SoleColorService.All().Select(sc => sc.SoleID).ToArray();
var soles = SoleService.All().Where(s => ids.Contains(s.ID));

我对静态 All() 方法有点怀疑。他们建议您使用静态上下文,这被认为是不好的做法。此外,我想知道这些协会。从字面上看,我希望 Sole 有一个 SoleColor,即 Sole 有一个 SoleColorId FK。

关于c# - 基于外键连接两个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15541880/

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