如何在NHibernate Queryover where子句中执行String.IsNullOrEmpty()测试?

如何在NHibernate Queryover where子句中执行String.IsNullOrEmpty()测试?,nhibernate,queryover,Nhibernate,Queryover,今天我遇到了一个情况,我们的遗留数据库中的一个字段永远不应该为空。。。空无一人 我正在对这个数据库使用NHibernate 3.2,受影响的查询是用QueryOver编写的 我现在的问题是 return Session .QueryOver<FacilityGroup>() .Where(fg => fg.Owner.Id == Token.OwnerId && fg.UserN

今天我遇到了一个情况,我们的遗留数据库中的一个字段永远不应该为空。。。空无一人

我正在对这个数据库使用NHibernate 3.2,受影响的查询是用QueryOver编写的

我现在的问题是

    return Session
        .QueryOver<FacilityGroup>()
        .Where(fg => fg.Owner.Id == Token.OwnerId && 
                     fg.UserName == Token.UserName)
        .OrderBy(fg => fg.Code).Asc
        .TransformUsing(Transformers.DistinctRootEntity);
返回会话
.QueryOver()
.Where(fg=>fg.Owner.Id==Token.OwnerId&&
fg.UserName==Token.UserName)
.OrderBy(fg=>fg.Code).Asc
.变压器使用(变压器的距离);
我希望是这样:

        return Session
            .QueryOver<FacilityGroup>()
            .Where(fg => fg.Owner.Id == Token.OwnerId && 
                         fg.UserName == Token.UserName && 
                         !string.IsNullOrEmpty(fg.Code))                
            .OrderBy(fg => fg.Code).Asc
            .TransformUsing(Transformers.DistinctRootEntity);
返回会话
.QueryOver()
.Where(fg=>fg.Owner.Id==Token.OwnerId&&
fg.UserName==Token.UserName&&
!string.IsNullOrEmpty(fg.Code))
.OrderBy(fg=>fg.Code).Asc
.变压器使用(变压器的距离);
当我尝试此操作时,会出现一个异常“无法识别的方法调用:System.String:Boolean IsNullOrEmpty(System.String)”

所以NHibernate无法转换string.IsNullOrEmpty。很公平。然而,当我尝试这个

        return Session
            .QueryOver<FacilityGroup>()
            .Where(fg => fg.Owner.Id == Token.OwnerId && 
                         fg.UserName == Token.UserName && 
                         !(fg.Code == null || fg.Code.Trim() == "" ))
            .OrderBy(fg => fg.Code).Asc
            .TransformUsing(Transformers.DistinctRootEntity);
返回会话
.QueryOver()
.Where(fg=>fg.Owner.Id==Token.OwnerId&&
fg.UserName==Token.UserName&&
!(fg.Code==null | | fg.Code.Trim()==“”)
.OrderBy(fg=>fg.Code).Asc
.变压器使用(变压器的距离);
我从范围“”引用了类型为“Domain.Entities.FacilityGroup”的InvalidOperationException“变量'fg',但未定义”


有什么想法吗?

好的。。。我想我问这个问题太早了。我想出了解决这个问题的办法

我能够做的是通过SQL函数投影从hql调用“trim”函数。我最终将其作为IQueryOver扩展方法来编写,以保持其灵活性。如果有人需要,我会把它贴在这里

public static class QueriesExtentions
{
    public static IQueryOver<E, F> WhereStringIsNotNullOrEmpty<E, F>(this IQueryOver<E, F> query, Expression<Func<E, object>> propExpression)
    {
        var prop = Projections.Property(propExpression);
        var criteria = Restrictions.Or(Restrictions.IsNull(prop), Restrictions.Eq(Projections.SqlFunction("trim", NHibernateUtil.String, prop), ""));
        return query.Where(Restrictions.Not(criteria));
    }
}
公共静态类查询扩展
{
公共静态IQueryOver,其中StringIsNotNullOrEmpty(此IQueryOver查询,表达式PropertExpression)
{
var prop=projects.Property(propExpression);
var条件=Restrictions.Or(Restrictions.IsNull(prop),Restrictions.Eq(projects.SqlFunction(“trim”,NHibernateUtil.String,prop),”);
返回query.Where(限制.非(条件));
}
}
现在正在使用

    return Session
        .QueryOver<FacilityGroup>()
        .Where(fg => fg.Owner.Id == Token.OwnerId && fg.UserName == Token.UserName )
        .WhereStringIsNotNullOrEmpty(fg => fg.Code)
        .OrderBy(fg => fg.Code).Asc
        .TransformUsing(Transformers.DistinctRootEntity);
返回会话
.QueryOver()
.Where(fg=>fg.Owner.Id==Token.OwnerId&&fg.UserName==Token.UserName)
.WhereStringIsNotNullOrEmpty(fg=>fg.Code)
.OrderBy(fg=>fg.Code).Asc
.变压器使用(变压器的距离);

如果拆下
饰件()
,会发生什么情况?