Nhibernate + QueryOver: фильтр с игнорированием чувствительных - PullRequest
10 голосов
/ 09 марта 2011

Я пытаюсь создать простой запрос в nHibernate с помощью QueryOver, но я хочу, чтобы он преобразовывал все строчные буквы или игнорировал чувствительные:

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

Как мне этого добиться?

UPDATE

Кто-то предположил, что проблема может быть связана со сбором БД, но у меня никогда не было проблем с этим, и этот скрипт работает:

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

Ответы [ 5 ]

17 голосов
/ 09 марта 2011

В QueryOver вы можете использовать следующее:

Domain.User User = Session.QueryOver<Domain.User>()
       .WhereRestrictionOn(x=>x.Login).IsInsensitiveLike("username")
       .SingleOrDefault();
5 голосов
/ 11 апреля 2013

Мой обходной путь для этого - использование expression.eq в сочетании с проекцией, поэтому с помощью queryover

query.Where(Expression.Eq(Projections.Property(Of MyType)
                (Function(x) x.Name), "something").IgnoreCase)
можно сделать регистр без учета регистра без каких-либо магических строк.
2 голосов
/ 09 марта 2011

Лучше всего изменить сопоставление вашей базы данных с учетом регистра. Если вы можете изменить базу данных.

1 голос
/ 08 февраля 2017
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)
0 голосов
/ 09 марта 2011

NH 3.0 имеет поставщика linq, поэтому вы можете использовать

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