1

我正在创建一个新的 NHibernate 方言以通过 ODBC 与 OpenEdge 10.2a 数据库一起使用。我一直在使用 NHibernate 2.1 中的方言没有问题,但是当将它移植到 NHibernate 3.3.1 时,我遇到了生成的查询 Like 语句的问题。

在 NHibernate 3.3.1 上使用方言时,使用startswith("sometest") 为linq 查询生成如下所示的类似语句。

select test from tests
where testname like (?||'%');
p0 = 'sometest' [Type: String (8)]

自 NHibernate 2.1 以来,这种情况发生了变化,OpenEdge 数据库不支持这一点。NHibernate 2.1 中的相同查询如下所示:

select test from tests
where testname like ?;
p0 = 'sometest%'

我曾尝试使用 MsSql2005Dialect,这会将生成的 SQL 稍微更改为:

select test from tests
where testname like (?+'%');
p0 = 'sometest' [Type: String (8)]

注意成为加号的管道。

是什么导致了这些变化,我该如何影响它,以便我可以让我的方言在 NH 3.3.1 上工作?

4

2 回答 2

2

不幸的是,这不适用于不支持将连接表达式作为 LIKE 参数的数据库。见NH-2254

解决方法是扩展 LINQ 提供程序。这是一个示例

于 2012-06-14T17:08:34.933 回答
0

我有这个问题的解决方法!如您所知,您可以为 Nhibernate 创建自己的方言类

我一直在使用这个项目中的方言:https ://nhibernate.jira.com/browse/NH-2327

但是我已经更改了 concat 函数,我将这一行添加到了类中:

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, concat(", ",+", ")"));

它确实会生成这个 Like 语句:like concat('%'+?+'%','')

解释: OpenEdge 的 concat 函数只接受 2 个变量,但神奇的是,在 concat 函数内部,它确实接受了一个 + 信号来连接字符串。

更新:您也可以参加我制作的OpenEdgeDialect课程。

于 2013-11-07T13:50:34.153 回答