2009-10-12 8 views
2

Je reçois "La valeur NULL ne peut pas être affectée à un membre de type System.Int32 qui est un type de valeur non-nullable" Lors de l'exécution de Sum() de mon instruction vide. ResultView fonctionne très bien, mais soitLinq: Sum of int

var r = from v in DataContext.Visits 
     join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id 
     where (bs.CreatedBy == userId) && (v.DateVisited.Year == workDate.Year) && 
     (v.DateVisited.Month == workDate.Month) && (v.DateVisited.Day == workDate.Day) && 
     (v.IsPreviewed == false) && (bs.ProfileProjectId != null) 
     select v; 

int? number = r.Sum(v => v.Counter); 

soit

var r = from v in DataContext.Visits 
     join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id 
     where (bs.CreatedBy == userId) && (v.DateVisited.Year == workDate.Year) && 
     (v.DateVisited.Month == workDate.Month) && (v.DateVisited.Day == workDate.Day) && 
     (v.IsPreviewed == false) && (bs.ProfileProjectId != null) 
     select v.Counter; 

int? number = r.Sum(v); 

échoue avec la même exception.

+1

Solution est de vérifier Count() avant somme, mais il semble être tout à fait stupide. – st78

Répondre

4

Essayez cette (mis à jour):

int number = r.Sum(v => (int?)v.Counter) ?? 0; 
+0

J'ai déjà essayé, compiler l'erreur de temps: Opérateur '??' ne peut pas être appliqué aux opérandes de type 'int' et 'int' – st78

+0

Voir ma mise à jour. –

0

On dirait que mettre && (v.Counter != null) filtrerait toutes les valeurs NULL cette valeur avant d'exécuter la somme.

+0

Dans la base de données et linq Counter n'est pas Nullable :( – st78

+0

Je voudrais revenir en arrière et essayer de comprendre pourquoi vous obtenez des nulls du tout Si les types sont non nulles et que vous utilisez la jointure LINQ (qui est le même que sql INNER JOIN) alors vous ne devriez pas obtenir des zéros, quelque chose ne s'additionne pas (probablement pourquoi vous posez la question). – LJM

1

Pourriez-vous inclure des données d'échantillon? À tout le moins, vous pouvez récupérer r.ToList() et regarder les valeurs à la main. D'après ce que je peux voir, cela devrait fonctionner correctement. Assurez-vous également que v.BaseContentID, bs.Id et v.DateVisited ne sont pas Nullable. (en particulier les colonnes ID) Tous les entiers nullables référencés peuvent provoquer cette exception. Non seulement ceux de la Sélectionnez clause

var r = from v in DataContext.Visits 
     join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id 
     where (bs.CreatedBy == userId) 
      && (v.DateVisited.Date == workDate.Date) 
      && (!v.IsPreviewed) 
      && (bs.ProfileProjectId.HasValue) 
     select v; 

int? number = r.Sum(v => v.Counter);