我有一个带有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());
}}
系统忽略区分大小写并选择用户。那么如何才能使案例敏感查询?
答案 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>()