从作用域引用的类型变量,但未定义。比较QueryOver

时间:2018-10-18 17:07:55

标签: c# nhibernate linq-to-nhibernate queryover

是的,我知道在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);

1 个答案:

答案 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
    ));