Fondamentalement, lorsque je fais la requête suivante, si aucune piste ne correspond, la requête suivante lève une exception. Dans ce cas, je préférerais que la somme égale 0 plutôt qu'une exception levée. Serait-ce possible dans la requête elle-même - je veux dire plutôt que de stocker la requête et de vérifier 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
la source
la source
Where
ne reviendrait pasnull
s'il ne trouvait aucun enregistrement, il renverrait une liste de zéro élément. Quelle est l'exception?SQL
est généré.Amount
n'est pas réellementnull
, c'est vraiment un problème concernant la façon dont il gère les résultats zéro. Jetez un œil à la réponse qui a été fournie.decimal
, votre code doit utiliserdecimal
. Oubliez que vous ayez jamais connufloat
etdouble
dans votre carrière de programmeur jusqu'au jour où quelqu'un vous dit de les utiliser, pour des statistiques ou la luminance des étoiles ou les résultats d'un processus stochastique ou de la charge d'un électron! Jusque-là, vous le faites mal .Réponses:
Essayez de modifier votre requête comme suit:
De cette façon, votre requête sélectionnera uniquement le
Amount
champ. Si la collection est vide, elle renverra un élément avec la valeur de0
, puis la somme sera appliquée.la source
Sum
celles - ci côté serveur plutôt que côté base de données? La solution de imo 2kay est plus optimale, au moins plus correcte sémantiquement.IQueryable<T>
chaîne s'arrête (généralement lorsque vous appelezToList
,AsEnumerable
, etc .. et dans ce casSum
).Sum
est une méthode connue et gérée par le fournisseur de requêtes EF et générera l'instruction SQL associée.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
plutôt que justeSELECT SUM(Amount) FROM Leads
. De plus, la sous-requête a un contrôle nul supplémentaire et une jointure externe étrange avec une table à une seule ligne.DefaultIfEmpty
n'est pas pris en charge par un certain nombre de fournisseurs LINQ, vous devrez donc ajouter unToList()
ou quelque chose de similaire avant de l'utiliser dans ces cas afin qu'il soit appliqué dans le scénario LINQ to Objects .Je préfère utiliser un autre hack:
la source
Essayez plutôt ceci, c'est plus court:
la source
C'est gagnant pour moi:
Dans ma table LOGIN, dans le champ NUMBEROFLOGINS certaines valeurs sont NULL et d'autres ont un nombre INT. Je additionne ici le nombre total de NUMBEROFLOGINS de tous les utilisateurs d'une société (chaque identifiant).
la source
Essayer:
La requête " SELECT SUM ([Amount]) " renverra NULL pour une liste vide. Mais si vous utilisez LINQ, il s'attend à ce que " Sum (l => l.Amount) " renvoie double et il ne vous permet pas d'utiliser l' opérateur " ?? " pour définir 0 pour une collection vide.
Afin d'éviter cette situation, vous devez faire en sorte que LINQ s'attende à " doubler? ". Vous pouvez le faire en lançant " (double?) L.Amount ".
Cela n'affecte pas la requête SQL, mais cela permet à LINQ de fonctionner pour des collections vides.
la source
la source
ToList
ici si vous ne voulez que la somme. Cela renverra l'ensemble de résultats complet (justeAmount
pour chaque enregistrement dans ce cas) en mémoire, puisSum()
cet ensemble. Mieux vaut utiliser une autre solution qui effectue le calcul via SQL Server.