是否可以跨DbSet重用查询表达式? 我在两个服务类中使用了几乎相同的方法.唯一的区别是他们操作的DbSet.如何使其泛化,从而不必为遵循此模式的每个其他服务重新创建查询逻辑.
public abstract class JobWithHistoryBase : JobBase, IHistoryWith
{/* common properties and methods defined */}
public class MeterInstallJob : JobWithHistoryBase
{/* not relevant */}
public class MeterRepairJob : JobWithHistoryBase
{/* not relevant */}
public class MeterInstallService
{
/* context plumbing */
public async Task<List<JobHistoryDto>> GetHistoryForWorkflow()
{
using var context = _contextFactory.CreateDbContext();
var result = await context.MeterInstallJob /* <-- */
.AsNoTracking()
.Where(x => x.WorkflowId == workflowId)
.Select(x => new JobHistoryDto()
{
WorkflowId = x.WorkflowId,
ActivityLabel = x.Activity.Label,
ActivityByPersonUserName = x.ActivityByPerson.Username,
ActivityStartDate = x.ActivityStartDate,
Comment = x.Comment
})
.ToListAsync();
}
}
public class MeterRepairService
{
/* context plumbing */
public async Task<List<JobHistoryDto>> GetHistoryForWorkflow()
{
using var context = _contextFactory.CreateDbContext();
var result = await context.MeterRepairJob /* <-- */
.AsNoTracking()
.Where(x => x.WorkflowId == workflowId)
.Select(x => new JobHistoryDto()
{
WorkflowId = x.WorkflowId,
ActivityLabel = x.Activity.Label,
ActivityByPersonUserName = x.ActivityByPerson.Username,
ActivityStartDate = x.ActivityStartDate,
Comment = x.Comment
})
.ToListAsync();
}
}
我希望是这样的:
public static async Task<List<JobHistoryDto>> GetHistoryForDbSet(DbSet<JobWithHistoryBase> dbset, int workflowId)
{
using var context = _contextFactory.CreateDbContext();
var result = await dbset /* <-- */
.AsNoTracking()
.Where(x => x.WorkflowId == workflowId)
.Select(x => new JobHistoryDto()
{
WorkflowId = x.WorkflowId,
ActivityLabel = x.Activity.Label,
ActivityByPersonUserName = x.ActivityByPerson.Username,
ActivityStartDate = x.ActivityStartDate,
Comment = x.Comment
})
.ToListAsync();
}
使用IQueryable
作为输入和输出也可以解决这个问题,因为可以在服务类中处理查询的上下文和执行.最终,我希望在构建这些服务的基础服务类中实现这些服务.