NHibernate IsInsensitiveLike将字符串区分大小写 [英] NHibernate IsInsensitiveLike treats strings as case sensitive

查看:102
本文介绍了NHibernate IsInsensitiveLike将字符串区分大小写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须遵循以下代码

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?

谢谢

推荐答案

信息很少,但总的来说-这应该(几乎是必须的)起作用.此功能是通过

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

InsensitiveLikeExpression.cs

这是代码段

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

这意味着,如果我们使用Postgre方言-将使用 ilike .对于其他任何情况,我们都应该看到(示例适用于SQL Server及其语言)

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%'

还要检查主叫方 QueryOverRestrictionBuilder.cs :

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

这篇关于NHibernate IsInsensitiveLike将字符串区分大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆