相关疑难解决方法(0)

存储库模式 - 如何正确处理JOIN和复杂查询?

我有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为查询创建一个存储库,并为每个实体创建"常规"存储库以进行操作.

我看到我们有这些选择:

  1. 在服务中公开IQueryable并执行JOIN复杂查询; 我真诚地觉得这是反模式,我不喜欢这样.
  2. 不要对这些~10个表使用Repository并在服务中执行查询; 一些文章建议使用EF就足够了(例如,是否可以绕过复杂查询的存储库模式?),我不同意这一点.
  3. 使用基于任务的区分,不要限制存储库1:1 repo:entity(我赞成这个选项)
  4. 完全不同的东西?

所以 - 你会建议什么?一次又一次,谢谢.

asp.net-mvc design-patterns domain-driven-design entity-framework repository-pattern

15
推荐指数
1
解决办法
5319
查看次数

获取对象内的所有关联/复合对象(以抽象方式)

业务:

我有一个支付系统,可以通过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

在此输入图像描述

参考:

  1. 实体框架4,继承vs扩展?
  2. 如何选择继承策略http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
  3. 流畅的API示例 - http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

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)

c# oop domain-driven-design entity-framework linq-to-sql

6
推荐指数
1
解决办法
1216
查看次数