以前はマッピングレイヤーで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句が作成されましたか?その場合、どこが間違っていますか?