首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为CONTAINSTABLE编写ICriteria (sql全文搜索)

为CONTAINSTABLE编写ICriteria (sql全文搜索)
EN

Stack Overflow用户
提问于 2011-12-23 18:30:36
回答 2查看 1.2K关注 0票数 4

我需要对多个表进行全文搜索,所以我使用了SqlServer CONTAINSTABLE函数,它作为一个SQL查询工作得很好,但是我如何才能将CONTAINSTABLE重写为NHibernate ICriteria.

代码语言:javascript
复制
SELECT DISTINCT CP.* FROM ContentPack CP
    INNER JOIN [Content] C ON CP.ContentPackId = C.ContentPackId

 INNER JOIN
     CONTAINSTABLE([Content], (Title, [Description]), 'Foo*') AS KEY_TBL
     ON C.Title = KEY_TBL.[KEY]

我需要把这个SQL转换成NHibernate ,有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2011-12-24 15:31:25

我也遇到了同样的问题

NHibernate + SqlServer full text search

我没有任何解决方案,所以我选择了拦截器的概念

1)我为主表创建了独立的条件,并加入了全文表。

2)还为nhibernate创建了一个自定义拦截器,它将用(select [key] as foreignkey,[rank] as rank FROM CONTAINSTABLE(full_text,full_text_col , 'Foo*'))替换全文表名。

代码

生成查询

代码语言:javascript
复制
SELECT c.id,
        c.name,
        ft.id, 
        ft.rank 
FROM candidates c 
    INNER JOIN full_text ft ON ft.id  = c.fulltext_id 
ORDER BY rank

截取后查询

代码语言:javascript
复制
SELECT c.id,
        c.name,
        ft.id,
        ft.rank 
FROM candidates c 
    INNER JOIN (
            SELECT [KEY] AS id ,[rank] AS rank 
            FROM CONTAINSTABLE(full_text, full_text_col, 'Foo*')
               ) AS ft ON ft.id  = c.fulltext_id 
ORDER BY rank

*DetachedCriteria*

代码语言:javascript
复制
        DetachedCriteria candidateCriteria = DetachedCriteria.For<Candidate>();
        DetachedCriteria fullTextCriteria = candidateCriteria.CreateCriteria("FullText");  

拦截器码

代码语言:javascript
复制
public interface CustomInterceptor : IInterceptor, EmptyInterceptor
{
    private string fulltextString;
    public string FulltextString
    {
        get { return fulltextString; }
        set { fulltextString = value; }
    }
    SqlString IInterceptor.OnPrepareStatement(SqlString sql)
    {
        string query = sql.ToString();
        if (query.Contains("full_text"))
        {
            sql = sql.Replace("full_text", "(select [key] as foreignkey,[rank] as Rank FROM CONTAINSTABLE(full_text, full_text_col, '"+FulltextString+"')) AS ft'");
        }
        return sql;
    }
}

实体

候选表格

id int

名称字符串

fulltext_id

full_text表包含全文索引

id int

full_text_col文本

秩int //始终为空

关系

候选人- FullText (1-1)

OpenSession

代码语言:javascript
复制
CustomInterceptor custonInterceptor=new CustomInterceptor();
custonInterceptor.FulltextString="YourString";
sessionFactory.OpenSession(custonInterceptor);
票数 5
EN

Stack Overflow用户

发布于 2011-12-23 18:56:37

您可以使用命名查询。

http://nhibernate.info/blog/2009/04/16/nhibernate-mapping-named-queries-lt-query-gt-and-lt-sql-query-gt.html

代码语言:javascript
复制
<sql-query name="MyQuery">
    <return alias="cp"
                    class="ContentPack"/>
    SELECT DISTINCT {cp.*}
    INNER JOIN [Content] C ON CP.ContentPackId = C.ContentPackId
    INNER JOIN
     CONTAINSTABLE([Content], (Title, [Description]), 'Foo*') AS KEY_TBL
     ON C.Title = KEY_TBL.[KEY]
</sql-query>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8619444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档