Как использовать функцию datediff sql в nHibernate? - PullRequest
0 голосов
/ 25 марта 2019

Я занимаюсь разработкой приложения для тестирования SQL-запросов времени выполнения с использованием различных структур.У меня есть некоторые проблемы, чтобы написать один из запросов, используя Fluent nHibernate.Запрос должен возвращать всех сотрудников старше 50 лет.На какой-то странице я обнаружил класс DateProjection, который я прикрепил ниже.

public static class DateProjections
    {
        private const string DateDiffFormat = "datediff({0}, ?1, ?2)";

        public static IProjection DateDiff(
            string datepart,
            Expression<Func<object>> startDate,
            Expression<Func<object>> endDate)
        {
            // Build the function template based on the date part.
            string functionTemplate = string.Format(DateDiffFormat, datepart);

            return Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, functionTemplate),
                NHibernateUtil.Int32,
                Projections.Property(startDate),
                Projections.Property(endDate));
        }
    }

Функция получения сотрудников следующая:

public List<EmployeeAgeViewModel> GetEmployeesOlderThan50()
        {
            Person personAlias = null;
            EmployeeAgeViewModel result = null;

            var temp = _session.QueryOver<Employee>().JoinQueryOver(x => x.Person, () => personAlias).SelectList(
                list => list
                .Select(x => personAlias.FirstName).WithAlias(() => result.FirstName)
                .Select(x => personAlias.LastName).WithAlias(() => result.LastName)
                .Select(x => x.Gender).WithAlias(() => result.Gender)
                .Select(x => x.BirthDate).WithAlias(() => result.BirthDate)
                .Select(x => x.HireDate).WithAlias(() => result.HireDate)
                .Select(DateProjections.DateDiff("yy", () => personAlias.Employee.BirthDate, () => DateTime.Now)).WithAlias(() => result.Age)
                )
                .TransformUsing(Transformers.AliasToBean<EmployeeAgeViewModel>())
                .List<EmployeeAgeViewModel>();

            return temp.ToList();

Возможно, проблема в том, как я передаю дату рождения.свойство и DateTime.Now в функцию DateDiff.В переменной personAlias ​​свойство Employee имеет значение null - возможно, мне следует как-то назначить его раньше - любая помощь будет оценена.

1 Ответ

1 голос
/ 28 марта 2019

Вместо personAlias.Employee.BirthDate вам нужно использовать employeeAlias.

Ваш код с необходимыми изменениями выглядит так:

Person personAlias = null;
Employee employeeAlias = null;
EmployeeAgeViewModel result = null;

var temp = _session.QueryOver<Employee>(() => employeeAlias)
    .JoinQueryOver(x => x.Person, () => personAlias)
    .SelectList(
        list => list
        .Select(x => personAlias.FirstName).WithAlias(() => result.FirstName)
        .Select(x => personAlias.LastName).WithAlias(() => result.LastName)
        .Select(x => x.Gender).WithAlias(() => result.Gender)
        .Select(x => x.BirthDate).WithAlias(() => result.BirthDate)
        .Select(x => x.HireDate).WithAlias(() => result.HireDate)
        .Select(DateProjections.DateDiff("yy", () => employeeAlias.BirthDate, () => DateTime.Now))
            .WithAlias(() => result.Age)
        )
    .TransformUsing(Transformers.AliasToBean<EmployeeAgeViewModel>())
    .List<EmployeeAgeViewModel>();

return temp.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...