我正在(至少尝试)在我的.NET C#项目中实现Repository pattern
,因此当我需要与数据库进行通信时,我们会得到如下信息:
IList<Sole> soles = SoleService.All().ToList();
由于从服务调用的方法的名称在上面的查询中建议,我从
Sole
表中获取所有记录。我不需要,我认为这是实现此模式,在服务中保留过多自定义逻辑的正确方法。我的意思是,我只想保留All()
方法,对结果的每次修改都必须在服务方法之外进行。当前的问题是这个。我有实体
Sole
和实体SoleColor
。 SoleColor
有一个外键列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/