gpt4 book ai didi

sql-server - 如何通过 QueryOver API 对任何属性使用全文搜索

转载 作者:行者123 更新时间:2023-12-02 19:37:06 25 4
gpt4 key购买 nike

我正在尝试使用 SQL 函数 CONSTAINS 来过滤 QueryOver API 上的一些数据。

主要问题是我无法在 where 子句中使用 SqlFunction,它无法编译,因为需要 ICriterion

var result = Session.QueryOver<Individual>()
.Where(Projections.SqlFunction(
"FullTextContains", NHibernateUtil.Boolean,
Projections.Property<Individual>(x => x.LastName),
Projections.Constant("something")))
.List();

我尝试将其与 TRUE 常量匹配,但是当执行查询时,它会生成语法错误,因为 CONSTAINS 函数不能与 equals 运算符一起使用。

var result = Session.QueryOver<Individual>()
.Where(Restrictions.Eq(Projections.SqlFunction(
"FullTextContains", NHibernateUtil.Boolean,
Projections.Property<Individual>(p => p.LastName),
Projections.Constant("something")), true))
.List();

如何直接在 QueryOver API 上的 where 表达式中使用 bool SQL 函数

最佳答案

这是我让 QueryOver 支持它的发现:

var projection = Projections.SqlFunction("FullTextContains", 
NHibernateUtil.Boolean,
Projections.Property<Individual>(x => x.LastName),
Projections.Constant("something"));

var result = Session.QueryOver<Individual>()
.Where(new ProjectionAsCriterion(projection))
.List();

为了使用 IProjection 作为 ICriterion,我基于 NHibernate 项目中的 SimpleExpression 类创建了自己的实现。

public class ProjectionAsCriterion : AbstractCriterion
{
private readonly IProjection _projection;

public ProjectionAsCriterion(IProjection projection)
{
_projection = projection;
}

public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
IDictionary<string, IFilter> enabledFilters)
{
var columnNames = CriterionUtil.GetColumnNamesForSimpleExpression(
null, _projection, criteriaQuery, criteria, enabledFilters, this, string.Empty);

var sqlBuilder = new SqlStringBuilder(4 * columnNames.Length);

for (int i = 0; i < columnNames.Length; i++)
{
if (i > 0)
{
sqlBuilder.Add(" and ");
}

sqlBuilder.Add(columnNames[i]);
}
return sqlBuilder.ToSqlString();
}

public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
var typedValues = new List<TypedValue>();

if (_projection != null)
{
typedValues.AddRange(_projection.GetTypedValues(criteria, criteriaQuery));
}
typedValues.Add(GetParameterTypedValue(criteria, criteriaQuery));

return typedValues.ToArray();
}

private TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
return CriterionUtil.GetTypedValues(criteriaQuery, criteria, _projection, null).Single();
}

public override IProjection[] GetProjections()
{
return new[] { _projection };
}

public override string ToString()
{
return _projection.ToString();
}
}

关于sql-server - 如何通过 QueryOver API 对任何属性使用全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com