3

我(至少正在尝试)Repository pattern在我的 .NET C# 项目中实现,所以当我需要与数据库通信时,我会这样做:

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 可以作为SoleColorSoleID 外键中的外键找到的那些行。

现在我有点困惑——自从我上次使用纯 SQL 合成器以来已经有一段时间了。我认为这很容易使用 SQL 和 JOIN 实现。但是当涉及到 LINQ 并且到目前为止我的经验告诉我我需要这两个查询时:

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

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

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

4

1 回答 1

1

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

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。

于 2013-03-21T13:23:09.880 回答