是的,我知道在Stackoverflow中有很多关于此主题的问题可以解答,但是没有一个问题可以解决我的问题。
我正在尝试在QueryOver的where子句中比较两个字符串,但是我遇到了从作用域”引用的类型”的错误“变量”,但未定义”。我不知道自己在做什么错,也没有找到适合我的案例的例子。谁能帮我吗?
那是我的代码:
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);
答案 0 :(得分:0)
此声明(上述问题)
queryOverPaciente = queryOverPaciente
.Where(p => p.Identificacao.CompareTo(filtroRelatorio.MatriculaInicio) >= 0);
将在C#中定义的比较表示为string.CompareTo(
VALUE
)
:
- 条件小于零此实例在 VALUE 之前。
- 零该实例在排序顺序中的位置与 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)
));
出于好奇-甚至可以处理上面C#定义中所述的NULL,例如,我们可以添加ISNULL
语句(实际上更通用,更合适的COALESCE
) < / p>
// 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
));