4

以前はマッピングレイヤーでwhere句を使用して、特定のレコードが可能な限り低いレベルでアプリケーションに入るのを防ぎました。(主に、不要なレコードを除外するために大量のコード行を書き直す必要をなくすため)

これらは単純で、1列のクエリのように

this.Where("Invisible = 0");

existsただし、 SQLクエリを使用する必要があるシナリオが表示されています。

exists (select ep_.Id from [Warehouse].[dbo].EventPart ep_ where Id = ep_.EventId and ep_.DataType = 4

上記の場合、私は通常、短い名前で親テーブルEventを参照します。つまりevent_.Id、Nhibernateがこれらの短い名前を動的に生成するため、それがどうなるかを知ることは不可能です。

代わりにId、上から、だけを使用してみましたep_ where Id = ep_.EventId

コードが実行されると、動的な短縮名のために、EventPartテーブルの短縮ep_名の前に別の短縮名が付けられます。event0_.ep_ここでevent0_、は親テーブルを参照します。

これにより、が原因でSQLエラーが発生します。event0_との間ep_

だから私のEventMap中には次のものがあります

this.Where("(exists (select ep_.Id from [isnapshot.Warehouse].[dbo].EventPart ep_ where Id = ep_.EventId and ep_.DataType = 4)");

しかし、それが生成されると、これが作成されます

select cast(count(*) as INT) as col_0_0_
from [isnapshot.Warehouse].[dbo].Event event0_
where (exists (select ep_.Id from [isnapshot.Warehouse].[dbo].EventPart event0_.ep_ where event0_.Id = ep_.EventId and ep_.DataType = 4)

に正しく追加されましevent0_Id

これを処理するためにマッピングレイヤーのwhere句が作成されましたか?その場合、どこが間違っていますか?

4

3 に答える 3

0

ep_エイリアスを定義するときに「as」キーワードを使用してみてください。

于 2012-09-03T22:14:44.380 に答える
0

NHibernate.SqlCommand.Template クラスには、Where 句を変更するメソッド (RenderWhereStringTemplate) があります。コードを見ると、問題は ep_ が識別子 (基本的にはマップされたクラスのプロパティ) であると考えられているため、テーブルのプレフィックスを前に付けていることにあると思います。識別子であるかどうかを判断するコードは非常に単純です。基本的には、引用符で囲まれているかどうか、または az で始まり、含まれていないかどうかをチェックします。

最も簡単な解決策は、エイリアスを ep_ から _ep に変更することだと思います。通常、NHibernate が生成するプレフィックスと競合しないように、2 つの _ を使用します。

于 2012-09-05T17:49:46.313 に答える