Как убедиться, что оператор linq не потерпит неудачу - PullRequest
0 голосов
/ 20 сентября 2019

Какой правильный способ гарантировать, что эта инструкция linq будет выполнена как ожидалось, я имею в виду, что все параметры будут заполнены (не нулевые значения).

Вот пример:

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
    var query = await _context.article.AsNoTracking()
        .Where(x => x.ArticleStatusId == (int)request.ArticleStatus).ToListAsync();
}

Одна вещь может быть проблемой, и это request.ArticleStatus, если это ноль, чем этот статус не будет правильным ..

Я пробовал что-то вроде этого:

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
    if(request.Status.HasValue) // Included .HasValue but I guess there's more elegant one line solution?
    {
        var query = await _context.article.AsNoTracking()
                .Where(x => x.ArticleStatusId == (int)request.ArticleStatus).ToListAsync();
    }
}

Спасибо

Приветствия

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если метод принимает ArticleStatus вместо articleRequest, он не выйдет из строя, т.е. вы никогда не получите InvalidCastException во время выполнения, если ArticleStatus не имеет значения nullable (ArticleStatus?) или не имеет другогобазовый тип, чем int (который является базовым типом по умолчанию для перечислений):

public async Task<IEnumerable<articles>> GetArticlesByStatus(ArticleStatus status)
{
    var query = await _context.article.AsNoTracking()
        .Where(x => x.ArticleStatusId == (int)status).ToListAsync();
}

Я предположил, что ArticleStatus является enum.

Если вы сохранитеПараметр articleRequest и articleRequest являются обнуляемым ссылочным типом. Прежде чем пытаться получить доступ к его свойству Status, проверьте его null:

Where(x => request == null || x.ArticleStatusId == (int)request.Status)

Остерегайтесь того, что ORM, такие как Entity Framework, могут неуметь переводить свои предикаты в допустимый SQL.

0 голосов
/ 20 сентября 2019

Если request.ArticleStatus является Nullable<ArticleStatus>, то вы можете просто привести его к Nullable<int> в своем запросе.

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
   var query = await _context.article.AsNoTracking()
      .Where(x => x.ArticleStatusId == (int?)request.ArticleStatus).ToListAsync();
   return query;
}

Это предполагает, что request не равно нулю, что является чем-товам нужно проверить.

Тем не менее, лично я предпочитаю то, что вы отправили.Я не уверен, что вы подразумеваете под "более элегантным", но если вы заранее знаете из состояния request, что запрос не даст никаких результатов ... зачем его запускать?Почему бы просто не пропустить отправку запроса в базу данных и вместо этого просто вернуть Enumerable.Empty<articles>()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...