NHibernateは:基準を使用して、値のリストでのクエリーフィルタ

StackOverflow https://stackoverflow.com/questions/1047895

  •  20-08-2019
  •  | 
  •  

質問

私は基準のAPIを使用して、値のリストでフィルタしようとしています。私は念のためにここに求めている、これが不可能であることを疑うます。

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のリストを持っていると仮定しました。私は、少なくとも一つのGUIDはGUIDのリストにあるすべてのエンティティをフィルタリングする。

SQLは次のようになります:

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

クライテリアAPIで、これは不可能のようです。

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

が例外をスローします。

役に立ちましたか?

解決

サブクエリに渡されたe.Guidsプロパティが単一の値ではありませんので、

あなたのクエリは動作しません。それをあなたが実際にあなたは、おそらくのLINQでこれを行うことができますが、残念ながら、基準のAPIに存在しない、交差点を実行し、その交点が空でないことを確認しようとしている。

この方法を行うには

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

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

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top