I am trying to build a simple query in nHibernate with QueryOver but I want it to convert everything lower-case or ignore sensitive:
Domain.User User = Session.QueryOver<Domain.User>()
.Where(x=>x.Login=="username")
.SingleOrDefault();
How can I achieve this?
UPDATE:
Someone suggested that the problem could be with the colletion of the DB but I've never had any kind of problem with that and this script works:
Domain.User User = Session
.CreateCriteria<Domain.User>()
.Add(Expression.Eq("Login", "username"))
.UniqueResult<Domain.User>();
In QueryOver you can use following:
Domain.User User = Session.QueryOver<Domain.User>()
.WhereRestrictionOn(x=>x.Login).IsInsensitiveLike("username")
.SingleOrDefault();
my workaround for this is using a expression.eq combined with a projection, so a case insensitive equals without any magic strings can be done with queryover
query.Where(Expression.Eq(Projections.Property(Of MyType)
(Function(x) x.Name), "something").IgnoreCase)
Better way is to change collation of your database to case insensitive one. If you can change database.
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()));
}
}
Usages:
Session.QueryOver<DTO>()
.WhereEqualInsensitive(t => t.Property, value)
ChildDTO childAlias = null;
Session.QueryOver<DTO>()
.JoinAlias(t => t.ChildDTO, () => childAlias)
.WhereEqualInsensitive(() => myAlias.Property, value)
NH 3.0 has a linq provider so you can use
Session.Query<Domain.User>()
.Where(x=>x.Login.ToLower() =="username")
.SingleOrDefault();
来源:https://stackoverflow.com/questions/5244561/nhibernate-queryover-filter-with-where-ignoring-sensitive