いつもあなたのクラスに依存し、あなたのテーブルにはあまり依存しません。 ORMを使用しており、クラスモデルで作業していることを覚えておいてください。
class Node
{
List<Node> Relations { get; private set; }
List<Node> InverseRelations { get; private set; }
}
あなたはこのようにそれをマッピングすることができる:
<class name="Node">
<!-- .... -->
<bag name="Relations" table="NodeRelation">
<key name="Fk_linkOne">
<many-to-many class="Node" column="Fk_linkTwo"/>
</bag>
<bag name="InverseRelations" table="NodeRelation" inverse="true">
<key name="Fk_linkTwo">
<many-to-many class="Node" column="Fk_linkOne"/>
</bag>
</class>
あなたがasymetrical関係を取得し、この方法は(これが意味:ノードAはノードBに関連したときに、あなたのクラスは次のように見えること想定
、もちろんBのInverseRelationを除いて、Bは必ずAに関連するとは限りません)。私はあなたが実際に必要なものを知らないので、これはあなたのデータベース設計に基づく仮定です。
あなたのクエリは、このように見えるかもしれ
:
from Node n
where
:x in elements(n.Relations)
or :x in elements(n.InverseRelations)
注:xは、エンティティタイプだけではなく、IDです(あなたがsession.Load<Node>(84)
を使用して、それをロードする必要がある)、
SAMYクエリのための別の方法:
select distinct n
from Node n
inner join n.Relations e1
inner join n.InverseRelations e2
where e1.id = 84 or e2.id = 84
または逆関係を使用することなく、別の方法:
私は第二の溶液を取ると、このようにそれを記述した基準で
:
session.CreateCriteria<Node>("n")
.SetProjection(Projections.Distinct("n"))
.CreateCriteria("Relations", "e1")
.CreateCriteria("InverseRelations", "e2")
.Add(Expression.Or(
Expression.Eq("e1.id", 84),
Expression.Eq("e2.id", 84));
は、あなたが見ることができますマッピングを持っていますか? –