Это утверждение (вопрос выше)
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
));