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

标签 sql-server nhibernate full-text-search queryover

我正在尝试使用 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/

相关文章:

php - 找不到与列列表匹配的 FULLTEXT 索引(已设置索引)

sql - 如何将单个字符串拆分为两个不同的列 sql

sql - 高效的 Ad-hoc SQL OLAP 结构

sql - 单个查询中的多个 MAX 值

c# - Nhibernate 在 db create 脚本中生成错误

perl - 如何使用其他数据存储实现 Redis 的功能?

sql - 将参数传递给 OLE DB SOURCE

NHibernate QueryOver子查询

c# - 导致 NHibernate 错误的域对象

google-app-engine - 什么时候不应该使用 App Engine 的全文搜索 API?