2

NHibernate CreateCriteria をNHLambdaExtensions基準に変換したいのですが、修正方法がわからないエラーが発生します。

NHibernate の基準は次のようになります。

var departments = DepartmentService
    .CreateCriteria()
    .CreateAlias( "Goals", "goal" )
    .Add( Expression.Eq( "goal.Company.Id", companyId ) )
    .Add( Expression.Eq( "goal.Program.Id", programId ) )
    .List<Business.Department>();

作成しようとしている NHLambdaExtensions 基準は次のようになります。

Business.Goal goalAlias = null;
var departments = DepartmentService
    .CreateCriteria()
    .CreateAlias<Business.Goal>( g => g.Department, () => goalAlias )
    .Add<Business.Goal>( g => g.Company.Id == companyId )
    .Add<Business.Goal>( g => g.Program.Id == programId )
    .List<Business.Department>();

私が得ているエラーは、「ビジネス部門のプロパティを解決できませんでした」です。エラーは明らかに「g => g.Department」に関係しており、元の NHibernate クエリには似たようなものは何もありませんが、式を取らないオーバーロードはありません。

4

2 に答える 2

3
Business.Goal goalAlias = null;
var departments = DepartmentService
    .CreateCriteria(typeof(Business.Department)) // need to specify the first criteria as Business.Department
        .CreateCriteria<Business.Department>(d => d.Goals, () => goalAlias)
            .Add<Business.Goal>( g => g.Company.Id == companyId )
            .Add<Business.Goal>( g => g.Program.Id == programId )
    .List<Business.Department>();

NHibernate Lambda Extensions (V1.0.0.0) - ドキュメンテーションで「Create Criteria Association With Alias」を探します。

編集:

実際には、これをより効率的に次のように書くことができます。

// no alias necessary
var departments = DepartmentService
    .CreateCriteria<Business.Department>()
        .CreateCriteria<Business.Department>(d => d.Goals)
            .Add<Business.Goal>( g => g.Company.Id == companyId )
            .Add<Business.Goal>( g => g.Program.Id == programId )
    .List<Business.Department>();
于 2009-09-14T17:58:44.320 に答える
0

私は NHLambdaExpressions を使用していません (しかし、かなりクールに見えます。すぐにチェックしてみます)。次のようなことができますか?

Business.Goal goalAlias = null;
var departments = DepartmentService
    .CreateCriteria()
        .CreateCriteria((Business.Department g) => g.Goals, () => goalAlias)
            .Add<Business.Goal>( g => g.Company.Id == companyId )
            .Add<Business.Goal>( g => g.Program.Id == programId )
            .List<Business.Department>();

これにより、Goals で新しい基準がルート化され、goalAlias を介してエイリアスが割り当てられると思います。

于 2009-04-17T21:14:46.387 に答える