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.
据我所知,比较应该不区分大小写,但如果名称为“Country”,则“country”一词不会返回任何匹配项。
What is wrong in this code expression?
这段代码表达式出了什么问题?
Thanks,
1 个解决方案
#1
There is too few information but in general - this should (almost must) work. This feature is implemented by
信息太少但总的来说 - 这应该(几乎必须)起作用。此功能由以下人员实施
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)
这意味着,如果我们使用Postgre方言 - ilike被使用。对于任何其他情况,我们应该看到(示例适用于SQL Server及其方言)
...
WHERE lower(this_.Name) like @p0'
,N'@p0 nvarchar(4000)'
,@p0=N'%country%'
Also Check the calling side QueryOverRestrictionBuilder.cs:
另请检查调用端QueryOverRestrictionBuilder.cs:
/// <summary>
/// A case-insensitive "like", similar to Postgres "ilike" operator
/// </summary>
public TReturn IsInsensitiveLike(object value)
#1
There is too few information but in general - this should (almost must) work. This feature is implemented by
信息太少但总的来说 - 这应该(几乎必须)起作用。此功能由以下人员实施
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)
这意味着,如果我们使用Postgre方言 - ilike被使用。对于任何其他情况,我们应该看到(示例适用于SQL Server及其方言)
...
WHERE lower(this_.Name) like @p0'
,N'@p0 nvarchar(4000)'
,@p0=N'%country%'
Also Check the calling side QueryOverRestrictionBuilder.cs:
另请检查调用端QueryOverRestrictionBuilder.cs:
/// <summary>
/// A case-insensitive "like", similar to Postgres "ilike" operator
/// </summary>
public TReturn IsInsensitiveLike(object value)