2009-10-12 38 views
2

我得到“无法将null值分配给System.Int32类型为非空值类型的成员”执行我的空语句的Sum()时。 ResultView工作正常,但无论是Linq: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); 

要么

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); 

失败,同样的异常。

+1

解决方法是检查和前COUNT(),但它看起来是相当愚蠢的。 – st78 2009-10-12 14:50:32

回答

4

试试这个(更新):

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

我试过了,编译时错误: 运算符'??'不能应用于'int'和'int'类型的操作数 – st78 2009-10-12 14:40:48

+0

请参阅我的更新答案。 – 2009-10-12 14:56:10

0

好像把&& (v.Counter != null)运行总和之前将筛选出该值的所有空值。

+0

在数据库和LINQ计数器是不可空的:( – st78 2009-10-12 14:41:24

+0

我会回头想办法弄清楚为什么你会得到任何空值。如果类型非空,并且你正在使用LINQ连接(这是与sql INNER JOIN相同),那么你不应该得到空值,有些东西不会加起来(可能你为什么要问这个问题)。 – LJM 2009-10-12 14:46:59

1

你能否包含一些样本数据?至少你可以抓住r.ToList()并手工查看这些值。从我可以看到这看起来应该很好。还要确保v.BaseContentID,bs.Id和v.DateVisited不可为空。 (特别是ID列)引用的任何可空的整数都可能导致该异常。不只是在的那些选择条款

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);