2010-01-16 5 views
12

ho ottenuto questo errore quando uso la funzione somma in LINQ:errore Linq parametro generico o la query devono utilizzare un tipo nullable

The cast to value type 'Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => Content.Amount==null?0:Content.Amount), 
+0

Qual è la tua domanda attuale? – AnthonyWJones

+0

Qual è il tipo di dati della proprietà Amount? – AnthonyWJones

risposta

4

Si potrebbe escludere alla fonte?

var sum = GroupProduct.Where(a => a.Product.ProductID==1 && a.Amount != null) 
      .Sum(a => (decimal)a.Amount); 
+0

Grazie ma è richiesta una condizione nulla su a.Product.ProductID == 1 .. – malik

+0

@malik - Non capisco; puoi ripetere questo commento? –

+0

Grazie ancora: Ci sono due cose. quando uso a.Product.ProductID l'oggetto è nullo, posso verificarlo in linq query. – malik

1

Questo sembra come dovrebbe funzionare (e di solito lo fa), ma fallisce quando il metodo Dove() restituisce il valore null: metodo "The cast to value type 'Decimal' failed because the materialized value is null" è dovuto alla somma():

decimal sum1 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount ?? 0); 

L'errore restituendo null (non zero) quando si somma su un set vuoto.

Uno di questi lavoro per me:

decimal? sum2 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount); 

decimal sum3 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount) ?? 0; 
10

Hai provato la seguente:

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (decimal?)Content.Amount) 

Il codice dalla mia applicazione si presenta come:

var data = query.AsEnumerable().Select(row => TaskInfo.FetchTaskInfo(row, 
     ctx.ObjectContext.Hours.Where(hour => hour.TaskId == row.TaskId).Sum(hour => (decimal?)hour.Duration), 
     ctx.ObjectContext.Notes.Count(note => note.SourceType == (int)SourceType.Task && note.SourceId == row.TaskId))); 
4

Prova questo:

var sum = GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (int?) Content.Amount); 
sum = sum ?? 0; 
11

Questo è quello che uso abitualmente. Ciò coprirà la possibilità che Amount sia nullo e copra anche la possibilità di un set vuoto.

GroupProduct.Where(a => a.Product.ProductID == 1) 
    .Select(c => c.Amount ?? 0) // select only the amount field 
    .DefaultIfEmpty() // if selection result is empty, return the default value 
    .Sum(c => c) 

DefaultIfEmpty() restituisce il valore di default associato con tipo Amount s', che è int, nel qual caso il valore di default è 0.

+0

@ Sнаđошƒаӽ: grazie per aver corretto gli errori nella mia risposta. MA ho rimesso l'operatore a coalescenza nulla. DefaultIfEmpty restituirà una sola voce 0 SOLO SE il set di risultati iniziale è vuoto, Se non è vuoto ma l'importo si verifica in valori nulli e ha un valore nullo, fallirà senza l'operatore null coalescing. – mendel

Problemi correlati