我正在尝试使用QueryOver在nHibernate中构建一个简单的查询,但我希望它将所有内容转换为小写或忽略敏感:
Domain.User User = Session.QueryOver<Domain.User>()
.Where(x=>x.Login=="username")
.SingleOrDefault();
我怎样才能做到这一点?
更新:
有人建议问题可能在于DB的收集,但我从来没有遇到任何问题,这个脚本有效:
Domain.User User = Session
.CreateCriteria<Domain.User>()
.Add(Expression.Eq("Login", "username"))
.UniqueResult<Domain.User>();
答案 0 :(得分:17)
在QueryOver中,您可以使用以下内容:
Domain.User User = Session.QueryOver<Domain.User>()
.WhereRestrictionOn(x=>x.Login).IsInsensitiveLike("username")
.SingleOrDefault();
答案 1 :(得分:5)
我的解决方法是将expression.eq与投影结合使用,因此不区分大小写等于没有任何魔术字符串可以通过查询来完成
query.Where(Expression.Eq(Projections.Property(Of MyType)
(Function(x) x.Name), "something").IgnoreCase)
答案 2 :(得分:2)
更好的方法是将数据库的排序规则更改为不区分大小写的数据库。如果你可以改变数据库。
答案 3 :(得分:1)
public static class QueryOverExtension
{
/// <summary>
/// This method is used in cases where the root type is required
/// Example: .WhereEqualInsensitive(t => t.Property, stringValue)
/// </summary>
public static IQueryOver<T, TU> WhereEqualInsensitive<T, TU>(this IQueryOver<T, TU> queryOver, Expression<Func<T, object>> path, string value)
{
return queryOver.Where(Restrictions.Eq(Projections.SqlFunction("upper", NHibernateUtil.String, Projections.Property(path)), value.ToUpper()));
}
/// <summary>
/// This method is used in cases where the root type is NOT required
/// Example: .WhereEqualInsensitive(() => addressAlias.DefaultEmail, contactEmailAddress)
/// </summary>
public static IQueryOver<T, TU> WhereEqualInsensitive<T,TU>(this IQueryOver<T, TU> queryOver, Expression<Func<object>> path, string value)
{
return queryOver.Where(Restrictions.Eq(Projections.SqlFunction("upper", NHibernateUtil.String, Projections.Property(path)), value.ToUpper()));
}
}
用途:
Session.QueryOver<DTO>()
.WhereEqualInsensitive(t => t.Property, value)
ChildDTO childAlias = null;
Session.QueryOver<DTO>()
.JoinAlias(t => t.ChildDTO, () => childAlias)
.WhereEqualInsensitive(() => myAlias.Property, value)
答案 4 :(得分:0)
NH 3.0有一个linq提供商,所以你可以使用
Session.Query<Domain.User>()
.Where(x=>x.Login.ToLower() =="username")
.SingleOrDefault();