1

经过一番挖掘,我发现以下NHibernate查询的原因

  IList<User> users = session.QueryOver<User>()                        
            .WhereRestrictionOn(user => user.EmployeeID)
            .IsInG<string>(new string[] {EmployeeID.ToUpper()})
            .List<User>();

没有在 Oracle 中工作是因为我没有将映射中的属性设置为“AnsiString”。IE

 <property name="EmployeeID" column="LAN_ID" type="AnsiString" /> 

有人可以告诉我为什么必须这样做吗?Oracle 中的底层数据类型是 varchar2

4

2 回答 2

2

其实里卡多你错了。VARCHAR 和 VARCHAR2 相同,但建议使用 VARCHAR2。NVARCHAR2 是 unicode 类型。查看:http ://docs.oracle.com/cd/B19306_01/server.102/b14220/datatype.htm#i3253

所以我的猜测是——如果你使用的是 VARCHAR2,你的 NHibernate 映射中需要 AnsiString。否则,它默认为 Unicode 字符串。如果您没有指定 AnsiString 并且您有 VARCHAR2 映射列,那么还有更多问题,而不仅仅是“ToUpper”问题。Oracle 将不得不进行类型转换,并且无法在搜索中使用索引。

我希望它有帮助!

于 2013-07-20T06:33:32.733 回答
0

AnsiString = VARCHAR = ANSI(不是 UNICODE) String = VARCHAR2 = UNICODE

我猜你一定有其他问题。

于 2012-06-28T09:24:16.193 回答