如何为三种几乎相同的方法制作单独的方法

时间:2020-03-30 08:31:05

标签: c# .net-core

我有一个.net核心应用程序。我有这个功能:

private IQueryable<Alert> GetAlerts(Expression<Func<Alert, bool>> filter, bool includeDone = false)
{
    var query = _patientDbContext.Alerts
        .Where(filter);

    if (!includeDone)
    {
        query = query.Where(i => !i.IsDone);
    }

    query = query.OrderBy(i => i.Deadline);

    return query;
}

我有三个使用过滤器功能的函数,如下所示:

public async Task<List<Alert>> GetAllAlertsForOrganisation(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    return await GetAlerts(i => i.OrganisationId == organisationId && (endDate == null || i.CreatedAt <= endDate) &&
        (beginDate == null || i.CreatedAt >= beginDate)).ToListAsync();           
}

public async Task<List<Alert>> GetAlertsForParticipantOfOrganisation(int organisationId, Guid participantId, DateTime? beginDate, DateTime? endDate)
{
   return await GetAlerts(i => i.OrganisationId == organisationId && (endDate == null || i.CreatedAt <= endDate) &&
        (beginDate == null || i.CreatedAt >= beginDate)).ToListAsync();          
}

public async Task<int> GetAllAlertsForOrganisationCount(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    return await GetAlerts(i => i.OrganisationId == organisationId && (endDate == null || i.CreatedAt <= endDate) &&
       (beginDate == null || i.CreatedAt >= beginDate)).CountAsync();         
}

但是它们几乎是相同的。那么可以写得短些吗?

1 个答案:

答案 0 :(得分:0)

您可以从Guid participantId中删除GetAlertsForParticipantOfOrganisation参数,因为该方法未使用此参数。然后,您可以将其删除,因为它与GetAllAlertsForOrganisation相同。

考虑到上述情况,您可以创建另一个返回IQueryable<Alert>的方法,并通过3种方法重复进行过滤:

public IQueryable<Alert> GetAllAlerts(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    return GetAlerts(i => i.OrganisationId == organisationId &&
        (endDate == null || i.CreatedAt <= endDate) &&
        (beginDate == null || i.CreatedAt >= beginDate));
}

然后,您可以在其他方法中使用相同的逻辑:

public async Task<List<Alert>> GetAllAlertsForOrganisation(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    return await GetAllAlerts(organisationId, beginDate, endDate).ToListAsync();
}

public async Task<int> GetAllAlertsForOrganisationCount(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    return await GetAllAlerts(organisationId, beginDate, endDate).CountAsync();
}
相关问题