CreateSqlQuery не получает скалярное значение в NHibernate - PullRequest
3 голосов
/ 13 ноября 2010

Почему переменная codigoUnificacion всегда равна нулю?

public int? GetCodigoUnificacionFamiliar(IList<Pariente> parientes)
        {
            List<string> cedulas = new List<string>();

            parientes.ToList().ForEach(p => cedulas.Add(p.Cedula));

            int? codigoUnificacion = Session
                .CreateSQLQuery(@"SELECT DISTINCT
                                            sa_bec_mtc_doc as Codigo
                                    FROM    sa_bec_matricula
                                            INNER JOIN sa_matricula ON sa_bec_matricula.sa_mtc_num = sa_matricula.sa_mtc_num
                                            INNER JOIN sa_alumno ON sa_matricula.sa_alu_cod = sa_alumno.sa_alu_cod
                                            INNER JOIN sa_periodo ON sa_matricula.sa_per_cod = sa_periodo.sa_per_cod
                                            INNER JOIN sa_tpo_beca ON sa_bec_matricula.sa_tpo_bec_cod = sa_tpo_beca.sa_tpo_bec_cod
                                    WHERE   sa_alu_ced IN (:cedulas)
                                            AND sa_per_abi = 1
                                            AND sa_tpo_bec_gpr = 2")
                .SetParameterList("cedulas", cedulas)
                .UniqueResult() as int?;

            return codigoUnificacion;
        }

Ответы [ 2 ]

9 голосов
/ 11 июля 2014

При выполнении запросов, которые возвращают скалярные значения в NHibernate

Это будет работать!

var max = session.CreateSQLQuery(query).UniqueResult();
decimal s = max != null ? Decimal.Parse(max.ToString()) : -1;

Это вернет ноль !!!

decimal? s = session.CreateSQLQuery(query).UniqueResult() as decimal?;

Это не скомпилируется

Поскольку допускаются только ссылочные или допускаемые значения

decimal s = session.CreateSQLQuery(query).UniqueResult() as decimal;

TypeConversionException

Исключение выдается из NHibernate

decimal s = (decimal)session.CreateSQLQuery(query).UniqueResult();
1 голос
/ 11 декабря 2015

Вместо использования var вы можете определить ожидаемый тип.

* ** 1003 тысяча два * Пример
int max = session.CreateSQLQuery(query).UniqueResult<int>();

Таким образом, вам не нужно пытаться применять приведение после факта.

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