在nHibernate QueryOver <t> </t>期间无法比较字符串

时间:2011-07-16 19:00:28

标签: c# nhibernate

我有一个简单的方法可以在用户登录时尝试验证用户,并且我使用Fluent nHibernate来保持持久性,所以我自然会实现ISession.QueryOver<T>来完成这项工作。

看起来如下。

var member = session.QueryOver<Member>()
   .Where(m => m.Email == Model.Email)
   .Take(1).SingleOrDefault();

确定。那么,手头的问题。

  1. 电子邮件地址始终需要比较不区分大小写。
  2. 他们应该始终以小写形式存在于数据库中。为了实现这一目标,我付出了巨大的努力。事实上,接受<input>的{​​{1}}对其有一个验证规则,只允许使用小写字母。但这仍然不够好,我想让它更深入,并且绝对确保一切都是犹太洁食。

    所以我试着这样做......

    Email Address

    我得到一个例外,即nhibernate不能使用var member = session.QueryOver<Member>() .Where(m => String.Compare (m.Email, Model.Email, StringComparison.OrdinalIgnoreCase) == 0) .Take(1).SingleOrDefault(); 方法。

    我意识到我可以用简单的String.Compare方法来解决这个问题,但是在某些情况下我可能需要比其他类型的比较更多的粒度。

    有人可以帮我弄清楚如何解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

使用IsInsensitiveLike:

有多种方法可以做到这一点
   var member= Session.QueryOver<Member>()
       .WhereRestrictionOn(m=>m.Email).IsInsensitiveLike(Model.Email)
       .Take(1).SingleOrDefault();

答案 1 :(得分:2)

如果@ VahidN的答案是依赖于默认排序规则和/或specifying an explicit one它不起作用,可以像以下那样依赖于SQL语言特定的大小写转换:

return _session.QueryOver<Registration>()
        .WhereEqualsIgnoreCase(r => r.Name, userName)   
        .Future().SingleOrDefault();

实施如下:

static class NHibernateCaseInsensitiveWhereExtensions
{
    public static IQueryOver<T, T2> WhereEqualsIgnoreCase<T, T2>(this IQueryOver<T, T2> that, Expression<Func<T, object>> column, string value)
    {
        return
            that.Where(
                Restrictions.Eq(
                    Projections.SqlFunction(
                        "upper", 
                        NHibernateUtil.String,
                        Projections.Property(column)),
                    value.ToUpper()));
    }
}

答案 2 :(得分:1)

SQL Server文本匹配是Case INSENSITIVE。如果您不喜欢,则必须更改排序规则SQL_Latin1_General_CP1_CS_AS)。所以你不需要改变任何东西(服务器端或客户端)。