Как сделать отдельный метод для трех почти одинаковых методов - PullRequest
3 голосов
/ 30 марта 2020

У меня есть основное приложение. 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 Ответ

1 голос
/ 30 марта 2020

Вы можете удалить параметр 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));
}

Затем вы можете использовать те же логики c другими способами:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...