10

我正在尝试使用 QueryOver 在 nHibernate 中构建一个简单的查询,但我希望它将所有内容转换为小写或忽略敏感:

Domain.User User = Session.QueryOver<Domain.User>()
       .Where(x=>x.Login=="username")
       .SingleOrDefault();

我怎样才能做到这一点?

更新

有人建议问题可能出在数据库的收集上,但我从来没有遇到过任何问题,这个脚本有效:

Domain.User User = Session
    .CreateCriteria<Domain.User>() 
    .Add(Expression.Eq("Login", "username")) 
    .UniqueResult<Domain.User>(); 
4

5 回答 5

17

在 QueryOver 中,您可以使用以下内容:

Domain.User User = Session.QueryOver<Domain.User>()
       .WhereRestrictionOn(x=>x.Login).IsInsensitiveLike("username")
       .SingleOrDefault();
于 2011-03-09T12:05:08.613 回答
6

我的解决方法是使用与投影相结合的 expression.eq,因此可以使用 queryover 完成不区分大小写且没有任何魔术字符串的等于

query.Where(Expression.Eq(Projections.Property(Of MyType)
                (Function(x) x.Name), "something").IgnoreCase)
于 2013-04-11T08:20:16.970 回答
2

更好的方法是将数据库的排序规则更改为不区分大小写的排序规则。如果可以更改数据库。

于 2011-03-09T11:33:03.020 回答
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)
于 2017-02-08T09:36:40.970 回答
0

NH 3.0 有一个 linq 提供程序,因此您可以使用

Session.Query<Domain.User>()
           .Where(x=>x.Login.ToLower() =="username")
           .SingleOrDefault();
于 2011-03-09T10:42:25.540 回答