C# 转换为值类型';Int32';失败

C# 转换为值类型';Int32';失败,c#,asp.net-mvc,linq,lambda,C#,Asp.net Mvc,Linq,Lambda,我有以下代码。我得到一个错误: 转换为值类型“System.Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型 var productItem=来自销售 在db.Sales\u inv\u详细信息中 选择新{ sales.sales\u Invoices.Customer.Cust\u Id, sales.sales\u Invoices.Customer.Customer\u Name, sales.sales\u Invoices.Employe.Emp

我有以下代码。我得到一个错误:

转换为值类型“System.Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型

var productItem=来自销售
在db.Sales\u inv\u详细信息中
选择新{
sales.sales\u Invoices.Customer.Cust\u Id,
sales.sales\u Invoices.Customer.Customer\u Name,
sales.sales\u Invoices.Employe.Emp\u Name,
sales.sales\u Invoices.Employe.Emp\u代码,
销售。销售发票。日期发票,
sales.Item.Item_ID,
销售数量,
销售数量价格,
sales.Item.Item_名称,
sales.Item.Item_代码,
单位度量=sales.Item.TBL\u单位度量代码,
sales.sales_Invoices.Descrption,
sales.disc};
productItem=productItem
其中(x=>(x.Date\u发票>=型号Fromdate&x.Date\u发票(x.Emp\u代码==型号Emp\u代码));

将数据库字段映射到模型似乎是错误的。
可能您的模型中有
int
属性,但数据库中的
int?
中有一个实体类上的属性定义为
int
System.Int32
),但数据库中有一个
null
值。由于
int
不能为
null
,因此出现此错误

要解决此问题,请确保数据库查询不返回空值,或者将属性定义更改为可为空的整数(
int?
nullable


要在数据库中找到相应的记录,请尝试在SQL Management Studio中重新创建查询(即设置相同的“WHERE过滤器”),并检查应包含整数值的空列的结果。

听起来您的模型将其中一个属性定义为不可空,但数据库将相应的列定义为可空,并且其中包含空值。当生成的读取器尝试填充模型时,BOOM。遗憾的是,我们无法告诉您是哪一个属性属性,它甚至不需要是该代码中提到的属性之一,因为它可以是
Sales\u inv\u details
表示的任何内容的
FrobNumber
属性


您需要非常仔细地检查您的模型。从
Sales\u inv\u details
表示的任何属性/列开始。当您发现不匹配时:将其标记为可空,然后重试。

没有实体模型很难判断,但当查询涉及一些
左外部联接时,通常会发生此异常de>,因此,尽管如果不在右侧(可选)包含
null
检查,LINQ to Entities不会生成NRE,但它要求您在投影内部将不可为null的值类型升级为可为null的值类型

检查以下一些关系:
sales.sales\u Invoices
sales.sales\u Invoices.Customer
sales.sales\u Invoices.Employe
sales.Item.TBL\u Unit\u Measure
。如果某些右端属性是可选的,请确保在投影,即如果您有
int
属性,请在select子句中使用
=(int?..
(或C#6
?。
运算符)


另外,异常消息表示
Int32
,因此请关注
int
列。

尝试使用

  • (国际?)
  • (p.property==null)?0:p.property

什么变量是空的?您调试过吗?您的模型是什么样子的?我甚至找不到我的空变量我在使用foreach(productItem中的var项)时遇到此错误但我猜这是描述和单位度量。调试时,仔细检查productItem中的项目,您会发现空变量。Just focusI有时也会出现此错误,但从未理解此错误的原因,但现在我得到了答案。感谢您的精彩解释
var productItem =   from sales 
                      in db.Sales_inv_details
                  select new { 
                           sales.Sales_Invoices.Customer.Cust_Id, 
                           sales.Sales_Invoices.Customer.Customer_Name,         
                           sales.Sales_Invoices.Employe.Emp_Name, 
                           sales.Sales_Invoices.Employe.Emp_code,
                           sales.Sales_Invoices.Date_invoice, 
                           sales.Item.Item_ID, 
                           sales.Qty, 
                           sales.Qty_Price, 
                           sales.Item.Item_Name, 
                           sales.Item.Item_Code, 
                           Unit_Measure = sales.Item.TBL_Unit_Measure.Code,
                           sales.Sales_Invoices.Descrption, 
                           sales.disc };

productItem = productItem
  .Where(x => (x.Date_invoice >= model.Fromdate & x.Date_invoice <= (model.Todate)));

productItem = productItem
  .Where(x => (x.Emp_code == model.Emp_code));