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();