我试图为每个结果计算一行的值。
这是我的要求:
bar_id
一切正常,除非'其中'条款不会返回任何结果。我希望能得到' 0'为了结果,我抓住了这个例外:
Null无法分配给成员System.Int32类型,因为它是一个 非可空值类型。
我可以轻松地做一个' if'使用' .Count!= 0'但我不想做两个请求,我想在一个请求中保留所有操作。
答案 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;