2013-03-15 39 views
0

我正在构建一个通过Nhibernate查询数据库的WPF应用程序。在Nhibernate中使用本机SQL Server功能?

我有一个SQL Server数据库与表xuser有一个标志(xflag),存储用户的权限。

现在我有这样的SQL查询,提取超级用户或管理员:

select * 
from xuser 
where (CONVERT(int,xflag) & 2 > 0) or (CONVERT(int,xflag) & 1 > 0) 

其中2 = flag_administrators1 = flag_superusers

没有SQL函数CONVERT,此查询不与错误的工作:

The data types numeric and int are incompatible in the '&' operator.

现在在我的WPF c#nhibnernate应用程序,我查询:

var xadmins= session.Query<Xuser>() 
        .Where(p => (p.Xflag & (int)Flag.FLAG_SUPERUSER)>0).ToList<string>(); 

此查询不适用于相同的SQL错误。

我想在此Linq2Nhibernate查询中使用T-SQL函数。我怎样才能做到这一点?

最大的问题是,这个应用程序必须与MsSql2008Oracle方言。如果我在这里使用Convert函数,当我将db更改为Oracle时,此函数会出错。什么是最好的实践?

回答

1

您可以指定它被转换为int,即

<property name="Xflag" formula="CONVERT(int,xflag)"/> 

或为功能NHibernate

Map(x => x.Xflag).Formula("CONVERT(int,xflag)"); 

为xflag作为公式的映射,然后你可以使用你的表情让所有超级用户无需投:

var xadmins= session.Query<Xuser>() 
       .Where(p => (p.Xflag & Flag.FLAG_SUPERUSER)>0).ToList<string>(); 

当然这有是SQL服务器SP的缺点ecific。对于此为甲骨文工作,你将需要使用的映射:

<property name="Xflag" formula="to_number(xflag)"/> 

为了解决这个问题可能会造成两个数据块一个用户定义函数,将进行转换,以映射随后将变为:

<property name="Xflag" formula="xflag_conversion(xflag)"/> 

随着Oracle UDF如下所示。

CREATE FUNCTION xflag_conversion(xflag IN CHAR) 
    RETURN NUMBER 
    BEGIN 
    RETURN(to_number(xflag)); 
END; 

在SQL Server UDF是:

CREATE FUNCTION xflag_conversion (@xflag CHAR) 
    RETURNS INT 
    AS 
    BEGIN 
    RETURN CONVERT(int,xflag) 
    END 

有关的UDF的准确性不能保证,虽然,我没有测试过。

最后,这里是关于查询您可能感兴趣的国旗信息的相关问题:How to query flags stored as enum in NHibernate