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