В основном, когда я делаю следующий запрос, если не было найдено ни одного потенциального клиента, следующий запрос вызывает исключение. В этом случае я бы предпочел, чтобы сумма равнялась 0, а не создавалось исключение. Будет ли это возможно в самом запросе - я имею в виду, а не хранить запрос и проверку query.Any()
?
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
c#
.net
entity-framework
Джон Майер
источник
источник
Where
Не будет возвращаться ,null
если он не нашел каких - либо записей, она возвращает список нулевых элементов. Что является исключением?SQL
как генерируется.Amount
на самом делеnull
это не проблема, а то, как она обрабатывает ноль результатов. Посмотрите на ответ, который был предоставлен.decimal
, ваш код должен использоватьdecimal
. Забудьте вы когда - нибудь знал ,float
иdouble
в вашей карьере программирования до того дня , кто - то говорит вам , чтобы использовать их для статистики или звезды яркости или результатов стохастического процесса или заряд электрона! До тех пор, вы делаете это неправильно .Ответы:
Попробуйте изменить свой запрос на это:
Таким образом, ваш запрос выберет только
Amount
поле. Если коллекция пуста, она вернет один элемент со значением,0
а затем будет применена сумма.источник
Sum
их на стороне сервера, а не на стороне базы данных? Решение imo 2kay является более оптимальным, по крайней мере, более семантически правильным.IQueryable<T>
цепь останавливается ( как правило , когда вы звонитеToList
,AsEnumerable
и т.д .. и в этом случаеSum
).Sum
является известным и обрабатываемым методом EF Queryable Provider, который генерирует соответствующий оператор SQL.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
а не простоSELECT SUM(Amount) FROM Leads
. Также подзапрос имеет дополнительную нулевую проверку и странное внешнее соединение с одной строкой таблицы.DefaultIfEmpty
это не поддерживается рядом провайдеров LINQ, поэтому вам придется добавитьToList()
или что-то подобное перед тем, как использовать его в этих случаях, чтобы он применялся в сценарии LINQ to Objects .Я предпочитаю использовать другой хак:
источник
Попробуйте это вместо этого, это короче:
источник
Это победа для меня:
В моей таблице LOGIN в поле NUMBEROFLOGINS некоторые значения имеют значение NULL, а другие имеют номер INT. Я суммирую здесь общее количество (NUMBEROFLOGINS) всех пользователей одной корпорации (каждый идентификатор).
источник
Пытаться:
Запрос « SELECT SUM ([Amount]) » вернет NULL для пустого списка. Но если вы используете LINQ, он ожидает, что « Sum (l => l.Amount) » возвращает значение double, и это не позволяет вам использовать оператор « ?? » для установки 0 для пустой коллекции.
Чтобы избежать этой ситуации, вам нужно заставить LINQ ожидать " double? ". Вы можете сделать это, применив " (double?) L.Amount ".
Это не влияет на запрос к SQL, но заставляет LINQ работать с пустыми коллекциями.
источник
источник
ToList
здесь, если все, что вы хотите, это сумма. Это вернет весь набор результатов (толькоAmount
для каждой записи в этом случае) в память и затемSum()
этот набор. Гораздо лучше использовать другое решение, которое выполняет вычисления через SQL Server.