我正在(至少尝试)在我的.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中那些行的列表结尾,在这些行中,可以在SoleColor SoleID外键中找到Sole.ID作为外键。

现在,我有点困惑-自从我上次使用纯SQL synthax以来已经有一段时间了。我认为使用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/

10-16 21:01