首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linq / ODataController中使用全文搜索

在Linq / ODataController中使用全文搜索
EN

Stack Overflow用户
提问于 2015-12-17 20:53:51
回答 2查看 1.7K关注 0票数 3

我正在开发一个通过OData提供数据的应用程序。我通过EF使用ASP.Net和ODataControllers查询--数据由SQLServer数据库支持。

在可视化这些数据的前端网站上,用户可以搜索结果--在前端动态创建一个$filter,并发送一个OData请求(允许服务器端过滤)。

在支持最终通过OData提供的数据的数据库表上,启用了全文搜索,但它出现在管道OData filter -> Linq查询-> SQL查询中,使用LIKE搜索而不是全文包含()方法。

有没有人知道有什么方法能以一种相当优雅的方式使用全文功能?

想必我可以用一个自定义的IODataPathHandler和/或IODataPathTemplateHandler和/或其他一些东西笨手笨脚地截取管道中的点,但如果可能的话,我宁愿尽量避免这样做。

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-12-20 13:01:13

OData的contains函数用于执行简单的子字符串匹配。OData规范定义了用于全文搜索的$search查询选项,但Web当前不支持$search。(这里有一个open issue。)

您最好的选择可能是自定义查询选项(例如,/Customers?fulltextsearch=contains(Name, 'Arianne')),但您必须编写所有代码来解析该选项,等等。

如果您决定将OData contains映射到T-SQL,那么您将需要拦截Linq到实体的转换。查看现有ContainsTranslator的源代码,然后向后工作。

票数 1
EN

Stack Overflow用户

发布于 2016-07-12 21:06:30

为此,请使用interceptor和自定义EnableQueryAttribute

  • 定义EnableQueryAttribute类的子类并覆盖ApplyQuery方法,为OData contains函数的所有参数添加FullTextPrefix (-FTSPREFIX-):

公共类模式: EnableQueryAttribute { public FullTextSearchAttribute IQueryable ApplyQuery(IQueryable queryable,ODataQueryOptions queryOptions) { if (queryOptions.Filter == null) return queryOptions.ApplyTo(queryable);常量字符串模式= "contains\(%20*^%27*%20*,%20*%27(?^%27*)";var matchEvaluator = new MatchEvaluator(match => { var value = match.Groups"Value".Value;返回模式($“%27{value}”,$"%27-FTSPREFIX-{value}");});var match.Value.Replace=新模式(HttpMethod.Get,Regex.Replace(queryOptions.Request.RequestUri.AbsoluteUri,HttpRequestMessage,matchEvaluator,RegexOptions.IgnoreCase);return new ODataQueryOptions(queryOptions.Context,request).ApplyTo(queryable);}}

  • 在代码中使用以下属性:

FullTextSearchAttribute公共查询Get() {// IQueryable }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34335117

复制
相关文章

相似问题

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