Как сделать из двух методов один метод в репозитории - PullRequest
0 голосов
/ 27 марта 2020

У меня есть два метода:

  private IQueryable<Alert> GetAlert(int organisationId, bool includeDone = false)
        {
            var query = _patientDbContext.Alerts
                .Where(i => i.OrganisationId == organisationId);

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

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

            return query;
        }


        private IQueryable<Alert> GetAlerts(int organisationId, DateTime? beginDate, DateTime? endDate ,  bool includeDone = false)
        {
            var query = _patientDbContext.Alerts
                .Where(i => i.OrganisationId == organisationId && (beginDate == null ||  i.CreatedAt <= endDate) && (endDate == null || i.CreatedAt >= beginDate));               

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

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

            return query;
        }

Таким образом, единственное отличие состоит в том, что один метод имеет в качестве параметров dateTeime для фильтрации.

Но возможно ли сделать один метод из этого?

Спасибо

Вот как я сейчас его использую:


  public async Task<Alert> GetAlertForOrganisation(Guid alertId, int organisationId)
        {
            return await GetAlert(organisationId)
                .Where(i => i.AlertId == alertId)
                .SingleOrDefaultAsync();
        }

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


1 Ответ

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

Вы можете отправить весь фильтр в качестве параметра выражения:

public 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;
}

И использовать его следующим образом:

var query1 = repository.GetAlerts(i => i.OrganisationId == organisationId)
    .ToList();
var query2 = repository.GetAlerts(i =>
        i.OrganisationId == organisationId && (beginDate == null || i.CreatedAt <= endDate) &&
        (endDate == null || i.CreatedAt >= beginDate))
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...