web-dev-qa-db-fra.com

La conversion en type de valeur 'Double' a échoué car la valeur matérialisée est null

CODE:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);

ERREUR:

La conversion en type de valeur 'Double' a échoué car la valeur matérialisée est null. Le paramètre générique du type de résultat ou la requête doit utiliser un type nullable.

CE QUE J'AI DÉJÀ VU:

La conversion en type de valeur 'Int32' a échoué car la valeur matérialisée est nulle

La conversion en type de valeur 'Decimal' a échoué car la valeur matérialisée est nulle

Ce que j'ai essayé:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .DefaultIfEmpty()
    .Sum(x => x.Quantity * x.Price);

Et:

double? cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);

Ni l'un ni l'autre ne fonctionne. Je sais que la cause du problème est qu'il n'y a pas de lignes dans cette table pour l'ID utilisateur que je passe. Dans ce cas, je préférerais que Sum () me renvoie un 0. Des idées?

22
Matt

Meilleure solution

double cafeSales = db.InvoiceLines
                     .Where(x =>
                                x.UserId == user.UserId &&
                                x.DateCharged >= dateStart &&
                                x.DateCharged <= dateEnd)
                     .Sum(x => (double?)(x.Quantity * x.Price)) ?? 0;
55
Jitendra Pancholi

Vous pouvez vérifier si la collection a des résultats corrects.

double? cafeSales = null;
var invoices = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd
    )
    .Where(x => x.Quantity != null && x.Price != null);
if (invoices.Any()) {
    cafeSales = invoices.Sum(x => x.Quantity * x.Price);
}
8
Maarten

Je sais que c'est un peu vieux, mais au cas où cela pourrait aider quelqu'un.

@Matt Je suppose que la méthode DefaultIFEmpty() devrait fonctionner pour vous au cas où vous transmettriez une valeur par défaut à la colonne sur laquelle vous appliquez Sum. Cette méthode comporte des surcharges que vous voudrez peut-être vérifier et je suggère de transtyper si les surcharges ne répondent pas à vos besoins.

 (query).DefaultIfEmpty(0) 
4
Jayant Shelke

Cela devrait faire l'affaire (vous devrez peut-être supprimer l'une des conditions si Quantity ou Price ne sont pas nullables):

var cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd &&
        x.Quantity != null &&
        x.Price != null);

double cafeSalesTotal = 0;

if (cafeSales.Any())
{
    cafeSalesTotal = cafeSales.Sum(x => x.Quantity * x.Price);
}

Les solutions ci-dessus n'ont pas fonctionné pour moi. Mon problème était similaire. J'étais sûr qu'aucune ligne n'était renvoyée, mais Sum se comporte de manière étrange. J'ai donc décidé d'ajouter un contrôle juste avant d'appeler l'expression lambda, où je vérifie la propriété count des lignes renvoyées par le lambda. S'il est supérieur à zéro, j'appelle l'expression sum. Cela a fonctionné pour moi.

0
Bryida
join sim in ctx.EF.Collaterals on new { id = ini.cam.id, Type = 0 } equals new 
{ id = sim.CampaignId == null ? new Guid() : sim.CampaignId, sim.Type } 
into tempcoll
from sim in tempcoll.DefaultIfEmpty()

Cette solution fonctionne.Actuellement, vous devez utiliser l'opérateur ternaire pour vérifier la valeur et insérer Guid si null dans la deuxième colonne et dans la deuxième table.et cela fonctionnera . "Le transfert vers le type de valeur 'Double' a échoué car le valeur matérialisée est nulle "sera résolu Merci

0
testing account
 var cafeSales = db.InvoiceLines
.Where(x =>
    x.UserId == user.UserId &&
    x.DateCharged >= dateStart &&
    x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);

double i;
if(cafeSales==null) ? i=0 : i=(double)cafeSales.First();
0
James