ODataV6.6.0不允许$search

ODataV6.6.0不允许$search,search,odata,Search,Odata,我正在尝试使用ODataV6.6.0$搜索功能。我最初的版本是5.2,后来更新为6.6.0。但是,我仍然无法使用$search。当我在url中使用它时 odata/Prescribers?$inlinecount=allpages&$top=20&$search=TEST'; 我收到此错误消息“不支持查询参数“$search” 我是否需要执行其他操作才能添加$search功能。顺便说一句,我还在我的控制器中使用EnableQuery,如下所示 [EnableQuery(

我正在尝试使用ODataV6.6.0$搜索功能。我最初的版本是5.2,后来更新为6.6.0。但是,我仍然无法使用$search。当我在url中使用它时

odata/Prescribers?$inlinecount=allpages&$top=20&$search=TEST';
我收到此错误消息“不支持查询参数“$search”

我是否需要执行其他操作才能添加$search功能。顺便说一句,我还在我的控制器中使用EnableQuery,如下所示

    [EnableQuery(AllowedQueryOptions = System.Web.Http.OData.Query.AllowedQueryOptions.All)]

 public IQueryable<ContactList> Get()
        {
            return dbContext.ContactsList.AsQueryable();
        }
[启用查询(AllowedQueryOptions=System.Web.Http.OData.Query.AllowedQueryOptions.All)]
公共IQueryable Get()
{
返回dbContext.ContactsList.AsQueryable();
}

WebApi目前不支持$search。为了支持它,您可以从这里开始模拟其他查询选项,然后引用您的私有构建的dll。

我找到了它。如果在筛选器中使用substringof,则返回包含字符串的值记录。我使用带有“or”运算符的$filter来检查多个列

'&$filter=substringof(\'' + key + '\', NPI)' +
  'or substringof(\'' + key + '\', Zip)' +                        
  'or substringof(\'' + key + '\', PrescriberName)';

这将显示筛选器中包含该字符串的所有记录

虽然这有点陈旧,但我想给大家介绍一个基于模型上AllowSearchAttribute的“$search到$filter”映射的实现。它被实现为从
EnableQueryAttribute
派生的属性。“魔法”是获取查询的
$search
部分,将其转换为
$filter
子句,并在基础结构完成进一步处理之前将其从参数中删除。这是通过将
request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey]
替换为已更改的数组来实现的。这是缓存,稍后的处理将从中获取查询字段(请参见
request.GetQueryNameValuePairs

在模型类上,可以通过将
[AllowSearch]
属性应用于所需的属性来指定应搜索哪些属性。在本例中,仅搜索
标题
说明

public class MyModel
{
    public int Id { get; set; }
    [AllowSearch]
    public string Title { get; set; }
    [AllowSearch]
    public string Description { get; set; }
    public string SomethingNotSearchable { get; set; }
}
在通常应用
[EnableQuery]
属性的方法上,您将使用派生的属性并指定模型类型:

[EnableQueryWithSearch(EnsureStableOrdering = true, ModelType = typeof(MyModel))]
[HttpGet]
public IQueryable<MyModel> Get()
{
    // your code here.
}
[EnableQueryWithSearch(EnsureStableOrdering=true,ModelType=typeof(MyModel))]
[HttpGet]
公共IQueryable Get()
{
//你的代码在这里。
}
现在可以使用$search参数调用OData端点,该参数将在内部映射到相应的$filter参数。当前实现始终使用
包含(…)
操作,但您可以使用自定义[AllowSearch]参数轻松增强实现,这将发出其他操作


希望这对别人有帮助。我在任何地方都找不到这种类型的任何其他实现,所以我想与大家分享。

那么您的意思是,仅仅OData支持$search是不够的,WebAPI还需要支持它吗?对不起,如果我是无知的,我正在学习C#和主干。那么,有没有办法让$filter具有SQL“LIKE”功能呢?我想是的,将来WebApi将支持$search。还有一个名为“contains”的函数,其行为与SQL“LIKE”类似,例如,$filter=contains(Name,'i')。试试看:
public class MyModel
{
    public int Id { get; set; }
    [AllowSearch]
    public string Title { get; set; }
    [AllowSearch]
    public string Description { get; set; }
    public string SomethingNotSearchable { get; set; }
}
[EnableQueryWithSearch(EnsureStableOrdering = true, ModelType = typeof(MyModel))]
[HttpGet]
public IQueryable<MyModel> Get()
{
    // your code here.
}