如何在通用存储库中编写通用内部连接?

时间:2012-02-04 18:27:23

标签: c# .net design-patterns c#-4.0 fluent-interface

我正在使用通用存储库来开发我自己的BLL with entity framework。Generic Repository但是所有通用存储库都没有内部连接。 Lokk下面:

 public interface IRepository
{
    IQueryable<T> List<T>() where T : class;
    T Get<T>(int id) where T : class;
    void Create<T>(T entityTOCreate) where T : class;
    void Edit<T>(T entityToEdit) where T : class;
    void Delete<T>(T entityToDelete) where T : class;
}

如何将上述代码转换为:

 public interface IRepository
{
    IQueryable<T> List<T>() where T : class;
    T Get<T>(int id) where T : class;
    void Create<T>(T entityTOCreate) where T : class;
    void Edit<T>(T entityToEdit) where T : class;
    void Delete<T>(T entityToDelete) where T : class;
void InnerJoin<T>(T entityName, TNew entityName2) where T : class, where TNew : class;
}

或者我认为我们可以像这样使用Fluent interfacve模式:

    public List<MyWorker> ListByID( int ID)
{
    using (var Ctx = new DomainRepository<Worker>(new ProposalsEntities()))
         return Ctx.Find<Worker>(q => q.ID== ID).ToList().InnerJoin(XEntity,x=>x.ID=q.ID).InnerJoin(YEntity,y=>y.ID=q.ID);
}
Yu可以给出另一个建议来实现这个奇妙的问题。如何在Generic Repository中编写上面的连接代码?

2 个答案:

答案 0 :(得分:4)

您的通用存储库无法做到这一点。抽象数据库的关系模型并不是一个好主意。它会阻止您使用特定于数据库的功能,例如...连接。

您可以通过添加额外的方法修复您的存储库:

IQueryable<T> Query<T>() { return dataContext.GetTable<T>(); }

(此示例适用于Linq 2 Sql)。

您需要能够为callerd提供可组合查询,而不是列表。然后呼叫者可以写:

from w in repo.Query<Worker>()
join e in repo.Query<XEntity>() on ...

如果允许注释:通用存储库模式不是一个好主意。它没有什么帮助,但造成很大的伤害。

直接直接使用DataContext / EntityContext / Session或使用专门的存储库。

答案 1 :(得分:0)

存储库不应公开连接功能。存储库提供的域对象可能由持久存储在多个表中的数据组成,但域层不应该知道这一事实,或者更一般地说,应该知道数据在持久层中采用的格式。某些数据源甚至可能无法提供连接功能。