我有一个简单的方法可以在用户登录时尝试验证用户,并且我使用Fluent nHibernate
来保持持久性,所以我自然会实现ISession.QueryOver<T>
来完成这项工作。
看起来如下。
var member = session.QueryOver<Member>()
.Where(m => m.Email == Model.Email)
.Take(1).SingleOrDefault();
确定。那么,手头的问题。
他们应该始终以小写形式存在于数据库中。为了实现这一目标,我付出了巨大的努力。事实上,接受<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
方法来解决这个问题,但是在某些情况下我可能需要比其他类型的比较更多的粒度。
有人可以帮我弄清楚如何解决这个问题吗?
答案 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)。所以你不需要改变任何东西(服务器端或客户端)。