是否可以跨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作为输入和输出也可以解决这个问题,因为可以在服务类中处理查询的上下文和执行.最终,我希望在构建这些服务的基础服务类中实现这些服务.

推荐答案

你可以试着这样做:

public static async Task<List<JobHistoryDto>> GetHistoryForWorkflow<T>(int workflowId) 
    where T: JobWithHistoryBase
{
    using var context = _contextFactory.CreateDbContext();
    var result = await context.Set<T>()
        .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();
}

像这样打电话:

var x = await GetHistoryForWorkflow<MeterRepairJob>(10);

我没有要判断的编译器,但是如果你有任何问题,请告诉我.

Csharp相关问答推荐

react 式扩展连接中的非交叉LeftDurationTimeout

使用yaml将Azure函数代码部署到FunctionApp插槽时出现问题(zip未找到)

C#自定义字典与JSON(de—)serialize

CS0103 dlibdotnet和www.example.com facerect不在上下文中

使用客户端密钥为Fabric Rest API生成令牌

为什么Blazor值在更改后没有立即呈现?

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

WPF DataGrid中的三维数据

从应用程序图API调用访问所有者字段

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

如何解决提交按钮后 Select 选项错误空参照异常

Blazor Web App WASM的两个独立项目令人困惑

使用Entity Framework6在对象中填充列表会导致列表大多为空

Savagger使用Fastendpoint更改用户界面参数

什么类型的对象存储在大对象堆(LOH)中

RabbitMQ群集的MassTransit配置问题

Blazor Server.NET 8中的Blazore.FluentValidation问题

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

并发表更新.EF核心交易