NHibernateは:基準を使用して、値のリストでのクエリーフィルタ
-
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));
所属していません StackOverflow