Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)

【前言】

   最近项目中需要把我们的第一版系统的SQL语句转换成Linq表达式,对于之前没有接触过Linq表达式的我,研究的过程中真的遇到了好多问题!最头疼的就是:

“无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)”

   今天就来说说这个令人头疼的bug!


【正文】

一、bug描述:

1、When——何时出现的?

此问题是出现在我写linq表达式中给实体里的“int类型的字段”赋值时出现的问题


2、Why——为什么出现?

(1)、首先看几组图,看完了解“int?”的童鞋就已经大概知道问题所在了

★数据库中的字段设计:

Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)


实体里的设计:

Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)


给实体赋值情况:

int和datetime类型:int?和DateTime?出现

Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)

string类型:

Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)


(2)、bug文字解说:

   int类型的字段在数据库中设计的是“default null”默认为空,而在C#中的int是不能为null的,所以为了解决这个冲突,C#中引入了可空类型,大家也都看到了我赋值时实际上并不是把数据库中的int赋给实体中的int,而是把“int?”赋值给了实体中的int。

   所以出现了bug:“无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)”


3、How——怎么解决呢?

Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)

二、“int?”简析:

1、What——可空类型


2、Where——由来

   众所周知,null值用来表示数据类型未被赋予任何值,它是一种引用类型且它只能赋值给引用类型。如果非要把它赋值给值类型int类型的时候,编译器就会报错。

   可是又有人会说了,咱们的数据库中int是可以为null的呀,但是C#中int是不能为null的,那怎么办呢?

   就为解决数据库中int可以为null,而C#中int不能为null”的问题,“可空类型”出世了!


3、How——使用

   int、bool等这些类型不能表示数据库中的“Null” 。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型,比如int?、bool?,这样
int? i=null 就可以了。


   最后,如果有想看小菜是如何在linq中出错的详细内容请见下篇博客的更新