Extensões Lambda NHibernate - CreateCriteria Issue
-
11-09-2019 - |
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.
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.