0

Nhibernate を介してデータベースにクエリを実行する WPF アプリケーションを構築しています。

ユーザーの権限を格納xuserするフラグ ( ) があるテーブルを持つ SQL Server データベースがあります。xflag

これで、スーパーユーザーまたは管理者を抽出する次の SQL クエリができました。

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

どこ2 = flag_administrators1 = flag_superusers

SQL 関数CONVERTがないと、このクエリはエラーで機能しません。

「&」演算子では、numeric と int のデータ型に互換性がありません。

今、私の WPF c# nhibnernate アプリで、次のクエリを実行します。

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

このクエリは、同じ SQL エラーでは機能しません。

この Linq2Nhibernate クエリで T-SQL 関数を使用したいと考えています。どうやってやるの?

大きな問題は、このアプリケーションが方言で動作するMsSql2008必要があることです。Oracleここで関数を使用すると、 Convertdb を に変更するとOracle、この関数はエラーになります。ベストプラクティスは何ですか?

4

1 に答える 1

2

xflag のマッピングを式として指定できるため、int に変換されます。

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

または Fluent NHibernate の場合

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

次に、式を使用して、キャストなしですべてのスーパー ユーザーを取得できます。

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

もちろん、これには SQL Server 固有であるという欠点があります。これを Oracle で機能させるには、次のマッピングを使用する必要があります。

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

この問題を回避するには、変換を実行する両方の DB にユーザー定義関数を作成して、マッピングを次のようにします。

<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 をテストしていないため、UDF の正確性について保証するものではありません。

最後に、興味のあるフラグ情報のクエリに関する関連する質問があります: How to query flags stored as enum in NHibernate .

于 2013-03-16T00:09:43.750 に答える