首页 新闻 会员 周边

Entity Framework中smallint列查询时CAST的问题

0
悬赏园豆:20 [待解决问题]

如果数据库某个被查询的列的类型是smallint,在LINQ to Entities中进行如下的查询:

.Where(a.LockFlag == 0);

注:上面代码中的LockFlag在数据库中是smallint类型,在实体类定义中是short类型。

运行时EF生成的SQL语句是这样的:

(0 =  CAST( [Extent1].[LockFlag] AS int))

而期望的SQL语句是这样的:

[Extent1].[LockFlag] = 0

如何解决这个问题?

问题补充:

用int16也是同样的问题

dudu的主页 dudu | 高人七级 | 园豆:31007
提问于:2012-03-19 15:43
< >
分享
所有回答(2)
0

(short)0呢?

 

居然也不行。。。

在属性上指明是smallint也不行。。还真是个问题啊。

FMax | 园豆:205 (菜鸟二级) | 2012-03-19 15:47

在实体定义中把short或int16改为int就可以了

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2012-03-19 16:14

@dudu: 这不是实体类的属性跟数据库里的定义不一致了么。。。奇怪.

支持(0) 反对(0) FMax | 园豆:205 (菜鸟二级) | 2012-03-19 16:26

@FMax: 應該可以寫成int,應該沒有關係的。這個轉換不會出問題的。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-19 16:50

@FMax: 是的,的确存在这个问题,改为int之后出现错误:System.InvalidOperationException : The 'LockFlag' property on 'Article' could not be set to a 'Int16' value. You must set this property to a non-null value of type 'Int32'. 

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2012-03-19 21:08
1

在实体定义中把“short或int16”改为int就可以解决问题,针对这个问题写了一篇博文:

解决Entity Framework生成"CAST AS int"SQL语句的问题

更新:

该解决方法存在问题,在where查询中符合要求,但在映射时出现错误:

System.InvalidOperationException : The 'LockFlag' property on 'Article' could not be set to a 'Int16' value. You must set this property to a non-null value of type 'Int32'. 

dudu | 园豆:31007 (高人七级) | 2012-03-19 18:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册