Как объединить запрос LINQ с проверкой Null

#c# #.net #linq

Вопрос:

Можно ли объединить эти запросы LINQ? Я бы, если бы это было так, затруднил бы чтение.

 docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id);
if (docCount == null)
{
   docCount = dbContext.Documents.Count(x => x.DocumentRequest.Guid == Guid);
}
 

Комментарии:

1. Я не понимаю. Почему это может docCount быть null ?

2. Вам не нужно этого делать. Enumerable.Count может вернуться 0, но он не вернется null

Ответ №1:

Попытка объединить их была бы крайне неэффективной, так как это привело бы к сложности O(N^2).

Ваш подход будет работать нормально, если вы измените проверку null на проверку целого числа 0, так как возвращаемое значение не может быть нулевым, поскольку int является типом значения.

Попробуй это:

 docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id);
if (docCount == 0)
   docCount = dbContext.Documents.Count(x => x.DocumentRequest.Guid == Guid);
 

Ответ №2:

Как уже говорилось, это должна быть проверка 0. Теперь, если ваш вопрос «могу ли я избежать перечисления 2, если я окажусь во втором случае», ответ «да»:

 (int idCount, int guidCount) = dbContext.Documents.Aggregate((0, 0), ((int id, int guid) acc, Document doc)
  => (acc.id   (doc.Id == id ? 1 : 0), acc.guid   (doc.Guid == guid ? 1 : 0)));
docCount = idCount != 0 ? idCount : guidCount;
 

который повторяет документы только один раз.

Это более читабельно? … нет. Немного более производительный и читаемый:

 int idCount = 0;
int guidCount = 0;
foreach (var document in dbContext.Documents)
{
    if (document.Id == id)
        idCount  ;

    if (document.Guid == guid)
        guidCount  ;
}
docCount = idCount != 0 ? idCount : guidCount;
 

Стоит ли оно того? Это зависит от ваших данных. Если перечисление ваших документов-это «горячий путь», который вы определили после надлежащего сравнительного анализа, и это лучшее улучшение, которое вы можете сделать в своей кодовой базе/архитектуре (например, сотни миллионов документов в удаленной базе данных, без копирования в локальной программе, и это число выполняется часто), тогда да.

В противном случае это преждевременная оптимизация, придерживайтесь своего решения с 0 вместо нуля.