Web API抛出System.InvalidOperationException,查询用户列表遇类型转换错误
解决值类型转换失败的问题
别着急,这个问题其实和where条件没关系,核心是你的数据和实体类的类型不匹配!
你看,你查询里用到了c.reports_to,如果数据库里reports_to字段允许为空(也就是存在NULL值的记录),但你的Users实体类里reports_to的类型是非可空的int(System.Int32),当Entity Framework试图把数据库里的NULL值映射到非可空int的时候,就会抛出这个转换失败的错误——因为NULL没法直接塞进一个必须有值的int里。
解决方法有两种,选适合你的就行:
方法一:修改实体类的属性类型
把Users类里的reports_to改成可空int类型,也就是int?:public int? reports_to { get; set; }这样EF就能正确处理数据库里的NULL值了。
方法二:在查询里处理NULL值
如果不想改实体类,那就在查询的时候给reports_to一个默认值(比如0),避免返回NULL:var users = from c in db.Users select new { c.id, c.user_name, reports_to = c.reports_to ?? 0 };这样即使数据库里是NULL,也会转换成0返回,不会触发类型转换错误。
补充说明
你之前看到的SO帖子里提到where参数为空的情况,只是这类错误的一种场景,但本质都是数据库里的NULL值没法映射到非可空的值类型,和有没有where条件无关——只要你的查询结果里包含了这种NULL的非可空字段,就会报错。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

