#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 вместо нуля.