Вопрос

Я хочу преобразовать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top