如何在泛型存储库中编写泛型innerJoin
本文关键字:泛型 innerJoin 存储 | 更新日期: 2023-09-27 18:22:49
我正在使用通用存储库来开发我自己的带有实体框架的BLL。通用存储库但所有通用存储库都没有内部联接。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这样的交互模式:
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);
}
余可以提出另一个建议来解决这个异想天开的问题。如何在Generic Repository中编写上述联接代码?
这在您的通用存储库中是不可能的。过于抽象数据库的关系模型不是一个好主意。它阻止您使用特定于数据库的功能,如。。。联接。
您可以通过添加一个附加方法来修复您的存储库:
IQueryable<T> Query<T>() { return dataContext.GetTable<T>(); }
(此示例适用于Linq 2 Sql)。
您需要能够为调用者提供可组合查询,而不是列表。来电者可以写下:
from w in repo.Query<Worker>()
join e in repo.Query<XEntity>() on ...
如果允许注释:通用存储库模式不是一个好主意。它帮不了什么忙,却造成很大的伤害。
直接使用DataContext/EntityContext/Session,或者使用专门的存储库。
存储库不应该公开联接功能。存储库提供的域对象可能由持久化在多个表中的数据组成,但域层不应该知道这一事实,或者更普遍地说,不应该知道数据在持久化层中采用的格式。某些数据源甚至可能无法提供联接功能。