NHibernate IsInsensitiveLike treats strings as case sensitive

瘦欲@ 提交于 2020-01-05 19:53:13

问题


Hi I have to following code

CurrentSession.QueryOver<Entity>()
.WhereRestrictionOn(x => x.Name).IsInsensitiveLike(filterValue,MatchMode.Anywhere)
.List()

As far as I know the comparision should be case insensitive, however if the name is "Country" the word "country" won't return any matches.

What is wrong in this code expression?

Thanks,


回答1:


There is too few information but in general - this should (almost must) work. This feature is implemented by

InsensitiveLikeExpression.cs

Here is the snippet

public override SqlString ToSqlString(ICriteria criteria
  , ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
    //TODO: add default capacity
    SqlStringBuilder sqlBuilder = new SqlStringBuilder();
    SqlString[] columnNames =
        CriterionUtil.GetColumnNames(propertyName, projection
                                    , criteriaQuery, criteria, enabledFilters);

    if (columnNames.Length != 1)
    {
        throw new HibernateException("insensitive like may only " +
            " be used with single-column properties");
    }

    if (criteriaQuery.Factory.Dialect is PostgreSQLDialect)
    {
        sqlBuilder.Add(columnNames[0]);
        sqlBuilder.Add(" ilike ");
    }
    else
    {
        sqlBuilder.Add(criteriaQuery.Factory.Dialect.LowercaseFunction)
            .Add("(")
            .Add(columnNames[0])
            .Add(")")
            .Add(" like ");
    }

    sqlBuilder.Add(criteriaQuery.NewQueryParameter(
        GetParameterTypedValue(criteria, criteriaQuery)).Single());

    return sqlBuilder.ToSqlString();
}

Which means, that if we use Postgre dialect - ilike is used. For any other case we should see (example realted to SQL Server and its dialect)

...
WHERE lower(this_.Name) like @p0'
,N'@p0 nvarchar(4000)'
,@p0=N'%country%'

Also Check the calling side QueryOverRestrictionBuilder.cs:

/// <summary>
/// A case-insensitive "like", similar to Postgres "ilike" operator
/// </summary>
public TReturn IsInsensitiveLike(object value)


来源:https://stackoverflow.com/questions/30106436/nhibernate-isinsensitivelike-treats-strings-as-case-sensitive

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!