Wenn bei der folgenden Abfrage keine Leads gefunden werden, löst die folgende Abfrage eine Ausnahme aus. In diesem Fall würde ich es vorziehen, wenn die Summe 0 ist, anstatt dass eine Ausnahme ausgelöst wird. Wäre dies in der Abfrage selbst möglich - ich meine, anstatt die Abfrage zu speichern und zu überprüfen 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
quelle
quelle
Where
würde nicht zurückkehren,null
wenn es keine Datensätze finden würde, es würde eine Liste von null Elementen zurückgeben. Was ist die Ausnahme?SQL
generiert wird.Amount
ist nicht wirklichnull
, es ist wirklich ein Problem, wie es mit Null-Ergebnissen umgeht. Schauen Sie sich die Antwort an, die gegeben wurde.decimal
, Ihr Code sollte verwendendecimal
. Vergessen Sie, dass Sie jemals vonfloat
unddouble
in Ihrer Programmierkarriere gewusst haben, bis zu dem Tag, an dem Ihnen jemand sagt, dass Sie sie verwenden sollen, für Statistiken oder Sternleuchtdichte oder die Ergebnisse eines stochastischen Prozesses oder der Ladung eines Elektrons! Bis dahin machst du es falsch .Antworten:
Versuchen Sie, Ihre Abfrage folgendermaßen zu ändern:
Auf diese Weise wählt Ihre Abfrage nur das
Amount
Feld aus. Wenn die Sammlung leer ist, wird ein Element mit dem Wert von zurückgegeben,0
und dann wird die Summe angewendet.quelle
Sum
diese auf der Serverseite anstatt auf der Datenbankseite? Die Lösung von imo 2kay ist optimaler, zumindest semantisch korrekter.IQueryable<T>
Kette stoppt ( in der Regel , wenn Sie anrufenToList
,AsEnumerable
etc .. und in diesem FallSum
).Sum
ist eine bekannte und vom EF Queryable Provider behandelte Methode und generiert die zugehörige SQL-Anweisung.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
statt nurSELECT SUM(Amount) FROM Leads
. Außerdem hat die Unterabfrage eine zusätzliche Nullprüfung und einen seltsamen äußeren Join mit einer einzelnen Zeilentabelle.DefaultIfEmpty
dies von einer Reihe von LINQ-Anbietern nicht unterstützt wird.ToList()
In diesen Fällen müssen Sie daher ein oder ähnliches Element einfügen, bevor Sie es verwenden, damit es im Szenario LINQ to Objects angewendet wird .Ich bevorzuge einen anderen Hack:
quelle
Versuchen Sie dies stattdessen, es ist kürzer:
quelle
Das ist ein Gewinn für mich:
In meiner LOGIN-Tabelle im Feld NUMBEROFLOGINS sind einige Werte NULL und andere haben eine INT-Nummer. Ich summiere hier die Gesamtzahl der NUMBEROFLOGINE aller Benutzer einer Corporation (jede ID).
quelle
Versuchen:
Die Abfrage " SELECT SUM ([Amount]) " gibt für leere Liste NULL zurück. Wenn Sie jedoch LINQ verwenden, wird erwartet, dass die Summe " l (> l.Amount) " doppelt zurückgegeben wird, und Sie können den Operator " ?? " nicht verwenden, um 0 für die leere Sammlung festzulegen .
Um diese Situation zu vermeiden, muss LINQ " double? " Erwarten . Sie können es tun, indem Sie " (double?) L.Amount " wirken.
Die Abfrage an SQL wird nicht beeinflusst, aber LINQ funktioniert für leere Sammlungen.
quelle
quelle
ToList
hier wahrscheinlich nicht verwenden wollen, wenn Sie nur die Summe wollen. Dies gibt die gesamte Ergebnismenge (Amount
in diesem Fall nur für jeden Datensatz) in den Speicher und dannSum()
diese Menge zurück. Viel besser ist es, eine andere Lösung zu verwenden, die die Berechnung über SQL Server durchführt.