我正在开发一个通过OData提供数据的应用程序。我通过EF使用ASP.Net和ODataControllers查询--数据由SQLServer数据库支持。
在可视化这些数据的前端网站上,用户可以搜索结果--在前端动态创建一个$filter,并发送一个OData请求(允许服务器端过滤)。
在支持最终通过OData提供的数据的数据库表上,启用了全文搜索,但它出现在管道OData filter -> Linq查询-> SQL查询中,使用LIKE搜索而不是全文包含()方法。
有没有人知道有什么方法能以一种相当优雅的方式使用全文功能?
想必我可以用一个自定义的IODataPathHandler和/或IODataPathTemplateHandler和/或其他一些东西笨手笨脚地截取管道中的点,但如果可能的话,我宁愿尽量避免这样做。
有什么建议吗?
发布于 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的源代码,然后向后工作。
发布于 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 }
https://stackoverflow.com/questions/34335117
复制相似问题