gpt4 book ai didi

linq - 与 NHibernate 和 Oracle 的按位与

转载 作者:行者123 更新时间:2023-12-01 04:13:02 26 4
gpt4 key购买 nike

我正在使用 Fluent NHibernate 1.0RC(用于 NHibernate 2.1.4000)和 Linq 2 NHibernate,我想执行一个按位和操作的查询。我第一次尝试像这样使用 Linq,但这不起作用:

var objects = _session.Linq<MyClass>()
.Where(x => (x.someInteger & otherInteger) > 0)
.ToList();

我的结论是 Linq 2 Nhibermate 不支持按位运算。所以我尝试改用 HQL:
var objects =  _session.CreateQuery("select c from MyClass c 
where c.someInteger & :param > 0")
.SetParameter("param", otherInteger)
.List<MyClass>();

这也不起作用。它给了我一个 ora-01036 错误:“非法变量名称/编号”。

所以我的问题是:甚至可以在 NHibernate 中使用按位运算吗? NHibernate 3.0 是否支持开箱即用?这是有问题的,因为我使用的是 Oracle DB,它需要 bitand() 函数而不是 & 运算符?

最佳答案

您可以扩展 Oracle 方言并将 BITAND 添加为可识别的 HQL 函数:

public class OraclePlusDialect : Oracle10gDialect
{
public OraclePlusDialect()
{
RegisterFunction("bitand", new StandardSQLFunction("bitand", NHibernateUtil.Int32));
}
}

然后你应该能够像这样执行你的查询:
var objects =  _session.CreateQuery("select c from MyClass c 
where bitand(c.someInteger, :param) > 0")
.SetParameter("param", otherInteger)
.List<MyClass>();

可能是 Oracle 存在类型转换问题,因为 BITAND 返回很少使用的数据类型。如果是这种情况,请将您的 HQL 查询修改为:
select c from MyClass c 
where bitand(c.someInteger, :param) + 0 > 0

关于linq - 与 NHibernate 和 Oracle 的按位与,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com