我正在使用通用 repo 與 db 進行通用操作通信,我想添加一個函式來呼叫存盤程序或查詢。
我試圖在類中實作多個泛型,但是當我呼叫此代碼時,它總是回傳 T 型別的 Iqueryable,但是,我想使用多個類 T、T1、T2
RepositoryBase類
public abstract class RepositoryBase<T,T1> : IRepositoryBase<T,T1> where T : class where
T1:class
{
protected RepositoryContext RepositoryContext;
protected DbSet<T> dbSet;
public RepositoryBase(RepositoryContext repositoryContext)
{
RepositoryContext = repositoryContext;
}
public IQueryable<T> FindAll(bool trackChanges) => !trackChanges ?
RepositoryContext.Set<T>()
.AsNoTracking() :
RepositoryContext.Set<T>();
public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression,
bool trackChanges) =>
!trackChanges ?
RepositoryContext.Set<T>()
.Where(expression)
.AsNoTracking() :
RepositoryContext.Set<T>()
.Where(expression);
public void Create(T entity) => RepositoryContext.Set<T>().Add(entity);
public void Update(T entity) => RepositoryContext.Set<T>().Update(entity);
public void Delete(T entity) => RepositoryContext.Set<T>().Remove(entity);
//this is the function i am facing issue
public IQueryable<T> ExecuteSqlQueryOrProcedure(string sql)
{
return RepositoryContext.Set<T>().FromSqlRaw(sql);
}
}
IRepositoryBase介面
{
IQueryable<T> FindAll(bool trackChanges);
IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression,
bool trackChanges);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
IQueryable<T> ExecuteSqlQueryOrProcedure(string sql);
}
下面是我呼叫存盤庫基函式的存盤庫類..
public class SurveyDashboardRepository : RepositoryBase<SurveyStatistics, SurveyCropTypeWise>, ISurveyDashboardRepository
{
public SurveyDashboardRepository(RepositoryContext repositoryContext) : base(repositoryContext)
{
}
public async Task<IList<SurveyStatistics>> StatisticsAsync(SurveyStatisticsDto dto)
{
var query = $"Exec CN_RPT_SurveyDashBoard @Flag='GTY',@ForTheYear={dto.ForTheYear}";
if (dto.PlantCode.HasValue)
{
query = $",@PlantCode={dto.PlantCode}";
}
return await ExecuteSqlQueryOrProcedure(query).ToListAsync();
}
public async Task<IList<SurveyCropTypeWise>> CropTypeWiseAsync(SurveyCropTypeWiseDto dto)
{
var query = $"Exec CN_RPT_SurveyDashBoard @Flag='CT',@ForTheYear={dto.ForTheYear}";
if (dto.PlantCode.HasValue)
{
query = $",@PlantCode={dto.PlantCode}";
}
//on this line i am getting error
return await ExecuteSqlQueryOrProcedure<SurveyCropTypeWise>(query).ToList<SurveyCropTypeWise>();
}
}
下面是上面存盤庫類的相關介面
public interface ISurveyDashboardRepository
{
Task<IList<SurveyStatistics>> StatisticsAsync(SurveyStatisticsDto dto);
Task<IList<SurveyCropTypeWise>> CropTypeWiseAsync(SurveyCropTypeWiseDto dto);
}
所以在每個存盤庫中我將呼叫幾個程式,我不確定如何處理這個問題,非常感謝任何幫助。
uj5u.com熱心網友回復:
您試圖使通用存盤庫做得太多。在這種情況下,使用它的唯一原因是獲得一個可以處理 CRUD 操作的基類。
關于IQueryable它是一個有漏洞的抽象,因為它迫使呼叫者具有持久的特定知識并違反了德米特法則。因此,它不是一個完整的抽象。如果您真的想遵循存盤庫模式,請將其洗掉。
一旦完成這些事情,您的基類就會簡單得多,并且您將不會遇到管理多種型別的問題。
如果您仍然無法使用多個型別定義,請停止使用該存盤庫的基類。沒有什么說專案中的所有存盤庫都需要遵循完全相同的模式。將其應用在適合的地方,否則會使您的代碼庫惡化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/341026.html
