2009-06-26 12 views
0

基準APIを使用して値のリストでフィルタリングしようとしています。私はこれが不可能だと思う、私はただここに確かに頼んでいる。NHibernate:条件を使用して値リストのフィルタリング

class Entity 
{ 
    int id { get; set; } 
    IList<Guid> Guids { get; set; } 
} 

マッピング:

<class name="Entity"> 
    <id ...></id> 
    <bag name="Guids" table="Entity_Guids"> 
    <key column="Entity_FK"/> 
    <element column="Guid"/> 
    </bag> 
</class> 

は、私が(実際にこれらは別のサブクエリである)GUIDのリストを持っていると仮定しました。少なくとも1つのGUIDがGUIDのリストにあるすべてのエンティティをフィルタリングしたい。

SQLは次のようになります。クライテリアAPIで

SELECT * 
FROM Entity e 
    inner join Entity_Guids eg 
    on e.id = eg.Entity_FK 
WHERE 
    eg.Guid in (subquery) 

は、これは不可能であると思われます。

ICriteria query = session 
    .CreateCriteria(typeof(Entity), "e") 
    .Add(Subqueries.In("e.Guids", subquery)) 

例外をスローします。

+0

例外:あなたのGUIDが適切なプロパティ(Valueプロパティは、実際のGUIDが含まれている)を持つエンティティであり、双方向の関係があった場合は、おそらくまだこれを行うことができます

? – MatthieuGD

+0

サブクエリは分離基準ですか? – MatthieuGD

+0

はい、サブクエリはDetachedCriteriaです。ただし、引数 'key'をnullにすることはできません。それは辞書にアクセスする際の例外と思われ、それほど意味がありません。 –

答えて

1

サブクエリに渡されるe.Guidsプロパティが単一の値ではないため、クエリは機能しません。このようにするには、実際に交差点を実行しようとしていて、その交差点が空ではないことを確認しています。残念ながら、Linqでこれを行うことはできますが、基準apiには存在しません。

var subquery2 = DetachedCriteria.For<GuidEntity>() 
    .Add(Subqueries.In("Value", subquery)) 
    .SetProjection("Entity_FK"); 

ICriteria query = session.CreateCriteria(typeof (Entity)) 
    .Add(Subqueries.In("Id", subquery2)); 
+0

私は正しい動作のためにSubqueries.PropertyIn()メソッドを使用しなければならないと思います。 "Id"をテーブルの列として使用します(例:select ...)。 Subqueries.In()は定数として "Id"をチェックします(例えば、 "select ..."のId)。 –

関連する問題