基于外键连接两个查询

时间:2013-03-21 07:38:41

标签: c# linq linq-to-sql

我(至少尝试)在我的.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 synthax以来已经有一段时间了。我认为使用SQL和JOIN很容易实现。但是当涉及LINQ时,我的经验到目前为止告诉我,我需要这两个查询:

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

然后制作某种JOIN / UNION来仅过滤我需要的结果。

那么我需要在这种情况下使用哪些工具会导致它不是我唯一需要这个的地方而且我想学会自己做,当然在这种情况下这样做?

1 个答案:

答案 0 :(得分: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()方法有点怀疑。他们建议你使用静态上下文,这被认为是不好的做法。我还想知道这些联想。通过我希望SoleSoleColor的单词的声音,即Sole有一个SoleColorId FK。