Pergunta

Eu quero converter um NHibernate CreateCriteria ao longo de um NHLambdaExtensions critérios, mas estou recebendo erros que eu não sei como consertar.

O NHibernate critérios esta aparência:

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

Os critérios NHLambdaExtensions que eu estou tentando criar esta aparência:

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>();

O erro que eu estou recebendo é "Não foi possível resolver propriedade Departamento de: Business.Department". O erro, obviamente, tem a ver com "g => g.Department", e não há nada na consulta original NHibernate que tem algo semelhante, mas não há sobrecargas que não levam a expressão.

Foi útil?

Solução

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>();

Procure "Criar Critérios Association Com Alias" em NHibernate Lambda Extensions (v1.0.0.0 ) - Documentação

EDIT:

Você pode realmente escrever isso com mais eficiência como:

// 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>();

Outras dicas

Eu não usei NHLambdaExpressions (mas parece muito legal e eu vou definitivamente verificá-la em breve), então eu estou apenas supondo aqui. você poderia fazer algo parecido com isto:

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>();

Eu acho que isso vai enraizar um novo critério de Metas e atribuir um alias via goalAlias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top