Переменная типа ссылается из области видимости, но она не определена.Ошибка сравнения строки в QueryOver - PullRequest
0 голосов
/ 18 октября 2018

Да, я знаю, что есть много вопросов на эту тему, открытых и отвеченных в stackoverflow, но ни один не решил мою проблему.

Я пытаюсь сравнить две строки в предложении where в QueryOver, но у меня былоошибка «переменная» типа «ссылка на область действия», но она не определена ».Я не знаю, что я делаю неправильно, и не нашел пример для своего дела.Кто-нибудь может мне помочь?

Это мой код:

var queryOverPaciente = _session.QueryOver(() => pacienteAlias).
    Where(() => pacienteAlias.DataCadastro.Value.IsBetween(dataInicio).And(dataFinal));


// Other things....

// the error occurs here. "Identificacao" and "MatriculaInicio" are strings 
// and I want to select all registers that "Identificacao" >= "MatriculaInicio".

queryOverPaciente = queryOverPaciente.Where(p => 
     p.Identificacao.CompareTo(filtroRelatorio.MatriculaInicio) >= 0);

1 Ответ

0 голосов
/ 19 октября 2018

Это утверждение (вопрос выше)

queryOverPaciente = queryOverPaciente
    .Where(p => p.Identificacao.CompareTo(filtroRelatorio.MatriculaInicio) >= 0);

, представляющее сравнение, определенное в C # как string.CompareTo(VALUE):

  • Условие Меньше нуля Этот экземпляр предшествует VALUE .
  • Ноль Этот экземпляр имеет ту же позицию в порядке сортировки, что и VALUE .
  • Больше нуля Этот экземпляр следует ЗНАЧЕНИЕ .- или- ЗНАЧЕНИЕ равно нулю.

, так что это вроде равно:

// negative means preceeds
string.CompareTo(`**`VALUE`**`) >= 0
// we only want follows or equals
string >= VALUE

и с помощью SQL мы можем выразить это напрямую:

column >= @VALUE

Вернемся к нашему решению NH / C #.Мы можем определить это так:

queryOverPaciente
    .UnderlyingCriteria
     // GeProperty will generate >=
    .Add(Restrictions.GeProperty(
        // column
        Projections.Property(nameof(pacienteAlias.Identificacao)),
        // constant
        Projections.Constant(filtroRelatorio.MatriculaInicio)
    ));

Любопытство - чтобы обрабатывать даже NULL, как указано в определении C # выше, мы можем, например, добавить ISNULL выражение (более общее и подходящее COALESCEна самом деле)

// use the Identificacao if filter is null
var isNull = Projections.SqlFunction("Coalesce"
    , NHibernate.NHibernateUtil.String
    , Projections.Constant(filtroRelatorio.MatriculaInicio)
    , Projections.Property(nameof(pacienteAlias.Identificacao))
);

queryOverPaciente
    .UnderlyingCriteria
    .Add(Restrictions.GeProperty(
        Projections.Property(nameof(pacienteAlias.Identificacao)),
        // the ISNULL projection instead of constant
        isNull
    ));
...