Zasadniczo, gdy wykonuję następujące zapytanie, jeśli nie zostaną dopasowane żadne potencjalne szanse, poniższe zapytanie zgłasza wyjątek. W takim przypadku wolałbym, aby suma wyrównała 0, zamiast zgłaszania wyjątku. Czy byłoby to możliwe w samym zapytaniu - mam na myśli raczej niż zapisywanie zapytania i sprawdzanie 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
John Mayer
źródło
źródło
Where
Nie wrócinull
, jeśli nie znaleźliśmy żadnych rekordów, to zwróci listę elementów zerowych. Jaki jest wyjątek?SQL
generowania.Amount
tak naprawdę nie jestnull
, to naprawdę problem z tym, jak radzi sobie z zerowymi wynikami. Spójrz na udzieloną odpowiedź.decimal
, twój kod powinien użyćdecimal
. Zapomnij, że kiedykolwiek znałfloat
idouble
w swojej karierze programowania aż do dnia, ktoś powie Ci, aby ich użyć do celów statystycznych lub gwiazdy luminancji lub wynikach stochastycznego procesu lub ładunku elektronu! Do tego czasu robisz to źle .Odpowiedzi:
Spróbuj zmienić zapytanie na to:
W ten sposób zapytanie wybierze tylko
Amount
pole. Jeśli kolekcja jest pusta, zwróci jeden element o wartości,0
a następnie zostanie zastosowana suma.źródło
Sum
ich po stronie serwera, a nie po stronie bazy danych? Rozwiązanie imo 2kay jest bardziej optymalne, przynajmniej poprawne semantycznie.IQueryable<T>
łańcuch zatrzymuje się (zazwyczaj podczas rozmowyToList
,AsEnumerable
itd .. i w tym przypadkuSum
).Sum
jest znaną i obsługiwaną metodą przez dostawcę zapytań EF i wygeneruje powiązaną instrukcję SQL.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
zamiast po prostuSELECT SUM(Amount) FROM Leads
. Również podzapytanie ma dodatkową kontrolę zerową i dziwne połączenie zewnętrzne z tabelą z jednym wierszem.DefaultIfEmpty
nie jest obsługiwany przez wielu dostawców LINQ, dlategoToList()
przed użyciem w takich przypadkach należałoby wrzucić coś podobnego, aby zastosować go w scenariuszu Obiekty LINQ .Wolę użyć innego hacka:
źródło
Spróbuj tego zamiast tego, jest krótszy:
źródło
To dla mnie wygrana:
W mojej tabeli LOGIN w polu NUMBEROFLOGINS niektóre wartości mają wartość NULL, a inne mają liczbę INT. Łączę tutaj całkowitą liczbę NUMBEROFLOGINS wszystkich użytkowników jednej korporacji (każdy identyfikator).
źródło
Próbować:
Zapytanie „ SELECT SUM ([Kwota]) ” zwróci NULL dla pustej listy. Ale jeśli użyjesz LINQ, spodziewa się, że „ Sum (l => l.Amount) ” zwraca wartość podwójną i nie pozwala na użycie operatora „ ?? ” do ustawienia 0 dla pustej kolekcji.
Aby uniknąć tej sytuacji, musisz sprawić, by LINQ oczekiwał „ podwójnej? ”. Możesz to zrobić, przesyłając „ (double?) L.Amount ”.
Nie wpływa na zapytanie SQL, ale sprawia, że LINQ działa dla pustych kolekcji.
źródło
źródło
ToList
tutaj, jeśli wszystko, czego chcesz, to suma. Spowoduje to powrót całego zestawu wyników (tylkoAmount
dla każdego rekordu w tym przypadku) do pamięci, a następnie doSum()
tego zestawu. Znacznie lepiej użyć innego rozwiązania, które wykonuje obliczenia za pomocą SQL Server.