如何使用QueryOver进行Nhibernate区分大小写的查询?

时间:2014-05-21 12:37:43

标签: nhibernate queryover

我有一个带有users表的简单数据库,它有简单的admin用户

  

UserName =“Admin”
  密码= “管理员”

我正在使用NHibernate在此表上查询登录表单。 假设登录表单以大写形式插入UserName="ADMIN"password="ADMIN"

系统不应允许登录。但是当我使用像这样的查询时

using (var session = NhibernateHelper.OpenSession())
{
  return new List<User>
         (session.QueryOver<User>()
                 .Where(u => u.UserName == userName)
                 .And(u => u.Password == password)
                 .Future());
}}

系统忽略区分大小写并选择用户。那么如何才能使案例敏感查询?

4 个答案:

答案 0 :(得分:2)

我们可以直接指定COLLATE作为SQL列评估的一部分

session
    .QueryOver<User>()
    // expecting that user name could be any case 
    // if not, we can use the same as for password below
    .Where(u => u.UserName == userName)
    // instead of this
    //.And(u => u.Password == password)
    .And(Expression.Sql(" Password = ? COLLATE Latin1_General_CS_AS"
       , password, NHibernateUtil.String));
    .Future()
    ;

上述声明将使用Latin1_General_CS_AS,其中CS表示:区分大小写,AS表示重音敏感

此外,还有一些自定义 LikeExpression 的草稿,它可以将COLLATE字符串用作const或设置:

答案 1 :(得分:-1)

另一种方法,不是使用QueryOver,而是使用LINQ:

session.Query<User>().Where(u => SqlMethods.Like(u.Username, "something")).ToList();

答案 2 :(得分:-1)

或者,与标准:

session.CreateCriteria(typeof(User), "u").Add(Restrictions.Like(Projections.Property("u.Username"), "something")).List<Username>();

答案 3 :(得分:-1)

最后,QueryOver:

session.QueryOver<User>().Where(Expression.Sql("Username LIKE ?", "something", NHibernateUtil.String)).List<User>()