我有Repository模式的问题 - 如何在几个存储库之间执行JOIN操作.在这个项目中,我们使用MVC,EF,DDD.我知道这种问题已经出现过好几次了,我稍后会在这篇问题中提到这些问题.
在通用存储库模型(IRepository)和特定存储库模型之间,我选择了特定选项,因为我将ORM(在我们的例子中为EF)视为通用存储库模式本身,因此添加另一个通用存储库并没有意义而是根据域需求定制存储库.
问题是我有几个(~10个)表,每个表有很多行(数百万),我需要执行JOIN,所以使用IList或IEnumerable是不可行的选项.
我的理解(和我的观点)是IQueryable不应该离开存储库("DAL中会发生什么,应该留在DAL中.").暴露IQueryable并在LINQ服务中使用它会更简单,但它强烈违反了关注点的分离并破坏了存储库的作用 - 在这种情况下,服务将与存储库做同样的事情.为了选择一些,这些文章支持这种观点(或者更确切地说是信念):
要返回IQueryable <T>或不返回IQueryable <T>
我应该从DAL返回IEnumerable <T>还是IQueryable <T>?
http://www.shawnmclean.com/blog/2011/06/iqueryable-vs-ienumerable-in-the-repository-pattern/
http://blog.ploeh.dk/2012/03/26/IQueryableTisTightCoupling/
还有类似的问题和解决方案,例如如何使用存储库模式和实体框架加入多个表?建议.Include(),但这不是重载表和多个表连接的选项 - 对于每个JOIN,我们使用子选择来限制实际连接的内容.
这个问题(答案和评论) - 如何使用存储库模式查询交叉表? - 基本上建议基于任务的区分:使用JOINS为查询创建一个存储库,并为每个实体创建"常规"存储库以进行操作.
我看到我们有这些选择:
所以 - 你会建议什么?一次又一次,谢谢.
asp.net-mvc design-patterns domain-driven-design entity-framework repository-pattern
业务:
我有一个支付系统,可以通过GiftCoupon,ClubMembershipCard等支付.一个支付本身可以有多个支付组件
课程:
我有一个付款类.它有支付组件,如GiftCouponPayment,ClubMembershipCardPayment,CashPayment等.每种组件类型都满足通用接口IPaymentComponent.我使用有关现有类型的知识实现了它.
问题
1)如何以抽象的方式实现这个功能- 不知道存在哪些类型?这意味着它需要适用于实现IPaymentComponent接口的所有类型.
2)如果在LINQ to SQL中无法实现它,是否可以在Entity Framework中实现?
3)当LINQ to SQL在Payment对象中生成GiftCouponPayment实体时,它是关联/聚合还是组合?
注意:我使用LINQ to SQL作为ORM.GiftCouponPayment和Payment是自动生成的类,这些对象由ORM创建.我通过使用部分类为这些类添加了更多功能.
注意:在数据库中,每个PaymentComponent(例如GiftCouponPayment)都有自己的属性(例如CouponValue,CardValue等).因此,按层次结构表将不会很好.我们需要单独的表格.那条线路有解决方案吗?
注意:此付款之前,数据库中已存在GiftCouponPayment.我们需要使用客户提供的GiftCouponPaymentID来识别GiftCouponPayment对象.我们只需要更新此表中的PaymentID列.
泄漏抽象是指任何已实现的抽象,旨在减少(或隐藏)复杂性,其中底层细节未被完全隐藏
LINQ to SQL Diagram

参考:
C#代码
public interface IPaymentComponent
{
int MyID { get; set; }
int MyValue { get; set; }
int GetEffectiveValue();
}
public partial class GiftCouponPayment : IPaymentComponent
{
public int MyID
{
get
{
return this.GiftCouponPaymentID;
}
set
{
this.GiftCouponPaymentID = …Run Code Online (Sandbox Code Playgroud)