Omu*_*Omu 4 sql-server nhibernate full-text-search criteria fluent-nhibernate
我需要对多个表进行全文搜索,所以我使用SqlServer CONTAINSTABLE函数,它可以作为SQL查询正常工作,但是如何将CONTAINSTABLE重写为NHibernate ICriteria.
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]
Run Code Online (Sandbox Code Playgroud)
我需要将此SQL转换为NHibernate Criteria,有人可以帮助我吗?
同样的问题,我也得到了
我没有得到任何解决方案所以我去了拦截器概念在哪里
1)我为主表创建了分离标准并加入了全文表
2)还为nhibernate创建了一个自定义拦截器,用于替换全文表名 (select [key] as foreignkey,[rank] as rank FROM CONTAINSTABLE(full_text,full_text_col , 'Foo*'))
生成的查询
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
Run Code Online (Sandbox Code Playgroud)
拦截后查询
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
Run Code Online (Sandbox Code Playgroud)
****DetachedCriteria****
DetachedCriteria candidateCriteria = DetachedCriteria.For<Candidate>();
DetachedCriteria fullTextCriteria = candidateCriteria.CreateCriteria("FullText");
Run Code Online (Sandbox Code Playgroud)
拦截器代码
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;
}
}
Run Code Online (Sandbox Code Playgroud)
实体
候选人表
id int
名字串
fulltext_id
full_text表包含全文索引
id int
full_text_col文本
rank int //始终为null
关系
候选人 - FullText(1-1)
的openSession
CustomInterceptor custonInterceptor=new CustomInterceptor();
custonInterceptor.FulltextString="YourString";
sessionFactory.OpenSession(custonInterceptor);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1080 次 |
| 最近记录: |