ちょっとした言い訳: 質問はマッピングを提供しません。クエリも欠落しています...したがって、何が問題なのかを推測することしかできません。しかし、いくつかの説明を提供しようとしましょう
なぜ受信が明確ではないのですか?
2つのテーブルを用意しましょう(質問の下のコメントの1つに示されているように)
親:
ParentId | Name
1 | Parent_A
2 | Parent_B
子:
ChildId | Color | ParentId
1 | green | 1
2 | grey | 1
3 | gold | 1
4 | green | 2
純粋なSQLで単純な選択を作成する場合、これを持っています
SELECT p.ParentId, p.Name
FROM Parent AS p
INNER JOIN Child AS c
ON p.ParentId = c.ParentId
WHERE
c.Color = 'green' OR c.Color = 'grey' OR c.Color = 'gold'
このクエリの結果はどうなりますか?
1 | Parent_A
1 | Parent_A
1 | Parent_A
2 | Parent_B
それを同様の基準に変換すると、次のようになります。
var sesion = ... // get session
var parent = sesion.CreateCriteria<Parent>();
var children = parent.CreateCriteria("Children");
// restrict the children
children.Add(Restrictions.Disjunction()
.Add(Restrictions.Eq("Color", "green"))
.Add(Restrictions.Eq("Color", "grey"))
.Add(Restrictions.Eq("Color", "gold"))
);
var list = parent
.SetMaxResults(10) // does not matter in our example, but ... it should be used always
.List<Parent>();
これは Criteria C# コードで、結果として複数の親が生成されます (上記のように同じ SQL が生成されるという事実のため)。
ご覧のとおり、問題は明らかに NHiberante 側にあるわけではありません。本当!Hibernate は無害であるだけでなく、必要なことも実行します。
解決
解決策はサブセレクトにあります
SQLでは、このようになります
SELECT p.ParentId, p.Name
FROM Parent AS p
WHERE p.ParentId IN (
SELECT c.ParentId
FROM Child AS c
WHERE c.ParentId = p.ParentId
AND c.Color = 'green' OR c.Color = 'grey' OR c.Color = 'gold'
)
これにより、最も望ましい結果が得られます。
1 | Parent_A
2 | Parent_B
そして、NHibernateでそれを行う方法は?
var sesion = ... // get session
var parent = sesion.CreateCriteria<Parent>();
//var children = parent.CreateCriteria("Children");
var children = DetachedCriteria.For(typeof(Child));
// restrict the children
children.Add(Restrictions.Disjunction()
.Add(Restrictions.Eq("Color", "green"))
.Add(Restrictions.Eq("Color", "grey"))
.Add(Restrictions.Eq("Color", "gold"))
);
// ad SELECT into this sub-select
children.SetProjection( Projections.Property("ParentId"));
// filter the parent
parent
.Add(Subqueries.PropertyIn("ParentId", children));
var list = parent
.SetMaxResults(10) // does not matter in our example, but ... it should be used always
.List<Parent>();
現在、サブセレクト (DetachedCriteria
およびSubqueries
NHibernate 機能) があり、重複はありません!