Расширения NHibernate Lambda — проблема CreateCriteria
-
11-09-2019 - |
Вопрос
Я хочу преобразовать CreateCriteria NHibernate в Расширения НХЛямбда критериям, но я получаю ошибки, которые не знаю, как исправить.
Критерии 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 нет ничего похожего, но нет перегрузок, которые не принимают это выражение.
Решение
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 (V1.0.0.0) — Документация
РЕДАКТИРОВАТЬ:
На самом деле вы можете написать это более эффективно как:
// 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>();
Другие советы
Я не использовал 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 и присвоению псевдонима через targetAlias.