3

ICriteria を DetachedCriteria に変換する方法は誰でも知っています。以下を使用して、既存の ICriteria をサブクエリの一部として使用する必要があります。

.Add(Subqueries.PropertyIn("Name", myDetachedCriteriaSubquery))

ICriteria を DetachedCriteria に変換する方法はありますか。信頼できる言及があれば「いいえ」を受け入れます。

4

3 に答える 3

3

mattk の回答に続いて、 DetachedCriteria を継承してそのコンストラクターにアクセスできます。

public class ConvertedDetachedCriteria : DetachedCriteria
{
    public ConvertedDetachedCriteria(ICriteria criteria) 
        : base((CriteriaImpl) criteria, criteria)
    {
        var impl = (CriteriaImpl) criteria;
        impl.Session = null;
    }
}

これで、次のようなコードを記述できます。

var criteria = Session.CreateCriteria<Person>()
   .Add(Restrictions.Eq("Name", "John"));

var clonedDetachedCriteria = new ConvertedDetachedCriteria(criteria);

var newCriteria = Session.CreateCriteria<Person>()
    .SetProjection(Projections.SubQuery(clonedDetachedCriteria))
    .List<string>();

免責事項: 私はこれを NH 2 で最小限のテストにのみかけました...それが機能するか、または有用であるという保証はありません。

于 2011-10-04T04:54:48.533 に答える
2
var clonedDetachedCriteria = new ConvertedDetachedCriteria(CriteriaTransformer.Clone(criteria));

あなたの基準セッションnullの場合、「オブジェクトリファラン..」例外を作成します。

使用するCriteriaTransformer.Clone(criteria)

于 2011-10-12T10:05:30.570 に答える
1

DetachedCriteriaには、ICriteriaを受け取るコンストラクターがありますが、これは内部です。CriteriaTransformerによって使用されます。おそらくあなたは似たようなものを実装することができますか?

于 2010-07-28T12:45:31.517 に答える