繁体   English   中英

如何在通用存储库中编写通用innerJoin?

[英]How to write generic innerJoin in Generic Repository?

我正在使用通用存储库来使用实体框架开发自己的BLL。 通用存储库但是所有通用存储库都没有内部联接。 在下面浏览:

 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);
}

Yuo可以再提出一个建议来解决这个奇妙的问题。 如何在通用存储库中编写以上联接代码?

这对于您的通用存储库是不可能的。 将数据库的关系模型抽象得太多不是一个好主意。 它阻止您使用特定于数据库的功能,例如...连接。

您可以通过添加其他方法来修复存储库:

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或使用专用存储库。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM