linq .sum请求异常

时间:2015-05-11 07:07:04

标签: c# sql sql-server linq

我试图为每个结果计算一行的值。

这是我的要求:

bar_id

一切正常,除非'其中'条款不会返回任何结果。我希望能得到' 0'为了结果,我抓住了这个例外:

  

Null无法分配给成员System.Int32类型,因为它是一个   非可空值类型。

我可以轻松地做一个' if'使用' .Count!= 0'但我不想做两个请求,我想在一个请求中保留所有操作。

3 个答案:

答案 0 :(得分:1)

试试这个:

    var resultat =
            _context.ODVCompteurs.Where(
                odv => odv.SiteId == siteId && odv.DateODV >= firstDayOfMonth && odv.DateODV < lastDayOfMonth)
                .ToArray();

        return resultat.Length != 0 ? resultat.Sum(x=>x.NbrEntree) : 0;

答案 1 :(得分:0)

在您的实体中,您的dbset“ODVCompteurs”由您组成,您有一个不可插入的Int32,它映射到数据库中的Nullable列。当您从DB获取记录时,如果任何行包含该非可空列的空值,则会获得上述异常,因为EF正在尝试将空值绑定到我们的实际属性,该属性不接受空值。最简单也是最常见(可能是唯一的)方式是将Int32变为Nullable<Int32>或简单int?,你的悲伤就会消失

为了更好地证明这个问题,假设我们的数据库中有一个名为Employee的表:

   CREATE TABLE EMPLOYEE 
(
  ID NUMBER(5, 0) NOT NULL 
, NAME VARCHAR2(40) NOT NULL 
, AGE NUMBER(3, 0) 
);

这是映射到该表的实体:

public class Employee{
  public int ID {get;set;}
  public string Name {get;set;}
  public int Age {get;set;} //This is the source of a potential exception
}

如果您获取的所有行在AGE列中包含的值与null不同,则不会出现任何异常。但是如果AGE的任何记录都为null,那么你会得到该异常。所以只需将有问题的一行改为:

public int? Age {get;set;}

答案 2 :(得分:-1)

尝试使用.DefaultIfEmpty(0)。如果在应用.Sum()之前集合为空,那么它将返回单个0行。

var resultat = _context.ODVCompteurs.Where(
                    odv => odv.SiteId == siteId && odv.DateODV >= firstDayOfMonth && odv.DateODV < lastDayOfMonth)
               .Select(x => x.NbrEntree)
               .DefaultIfEmpty(0)
               .Sum();
return resultat;