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

标签 nhibernate queryover

我今天遇到的情况是,传统数据库中的字段永远不应为空...为空。

我正在针对此数据库使用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);

我希望是这样的:
        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);

当我尝试此操作时,出现异常“无法识别的方法调用: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);

我收到InvalidOperationException“从范围''引用的'Domain.Entities.FacilityGroup'类型的变量'fg',但未定义”

有什么想法吗?

最佳答案

好吧...我想我提这个问题太早了。我想出了一种解决方法。

我所能做的就是通过SQL函数投影从hql调用'trim'函数。我最终将其编写为IQueryOver Extention方法,以保持其灵活性。如果有人需要,我会在这里张贴。

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));
    }
}

并在这里使用
    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);

关于nhibernate - 如何在NHibernate Queryover where子句中进行String.IsNullOrEmpty()测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12644330/

相关文章:

nhibernate - 使用 NHibernate 3.0 流利的 NHibernate

c# - 在 nHibernate QueryOver<T> 期间无法比较字符串

c# - 如何确保在资源上使用 using 关键字

c# - NHibernate Criteria QueryByExample 卡在中间的 SQL

NHIbernate:投影所有属性的快捷方式?

NHibernate QueryOver 限制字符串长度

c# - NHibernate - 脱水属性值时出错

c# - 如何在 C# 中的 NHibernate 的 QueryOver 中使用 Oracle 的内置关键字或函数?

c# - 使用 QueryOver 进行子查询