如果数据库某个被查询的列的类型是smallint,在LINQ to Entities中进行如下的查询:
.Where(a.LockFlag == 0);
注:上面代码中的LockFlag在数据库中是smallint类型,在实体类定义中是short类型。
运行时EF生成的SQL语句是这样的:
(0 = CAST( [Extent1].[LockFlag] AS int))
而期望的SQL语句是这样的:
[Extent1].[LockFlag] = 0
如何解决这个问题?
用int16也是同样的问题
(short)0呢?
居然也不行。。。
在属性上指明是smallint也不行。。还真是个问题啊。
在实体定义中把short或int16改为int就可以了
@dudu: 这不是实体类的属性跟数据库里的定义不一致了么。。。奇怪.
@FMax: 應該可以寫成int,應該沒有關係的。這個轉換不會出問題的。
@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'.
在实体定义中把“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'.