【问题标题】:How do I do a String.IsNullOrEmpty() test in an NHibernate Queryover where clause?如何在 NHibernate Queryover where 子句中进行 String.IsNullOrEmpty() 测试?
【发布时间】:2012-09-20 14:14:51
【问题描述】:

我今天遇到了一种情况,我们的旧数据库中应该永远为空的字段......是空的。

我正在对这个数据库使用 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',但它没有定义”

有什么想法吗?

【问题讨论】:

  • 如果您删除 trim() 会发生什么?

标签: nhibernate queryover


【解决方案1】:

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

我能够做的是通过 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));
    }
}

它正在使用中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多