OData:通配符(startswith)过滤 url 请求中的数字(ID)字段

Posted

技术标签:

【中文标题】OData:通配符(startswith)过滤 url 请求中的数字(ID)字段【英文标题】:OData:Wildcard (startswith) filtering for number (ID) fields in the url request 【发布时间】:2012-07-23 15:42:34 【问题描述】:

我一直在研究一种通过 OData 和 javascript 对我的实体的数字 ID 字段执行模糊搜索的方法。到目前为止,我还没有找到我正在寻找的答案。我可以使用“Startswith”过滤器选项完美地过滤其他 edm.string 列,但是当我尝试传入任何其他非字符串类型时,我会收到来自服务器的类型错误响应。

在我控制数据库的应用程序中,我成功地解决了这个问题,方法是创建我需要的视图并将视图的数字类型转换为字符串。然而,这似乎有点矫枉过正,为整个数据集创建一个视图,这样我就可以允许用户使用通配符搜索 ID,否则 OData 查询工作得很好。

有没有人找到一个好的解决方案?谢谢!

【问题讨论】:

【参考方案1】:

不幸的是,我认为您已经发现了最好的解决方案之一(创建视图)。您还可以创建一个允许您进行模糊搜索的服务操作。

您的后端使用什么?这在 LINQ-to-Entities 上不受支持,但您可能能够创建一个看起来像这样的服务操作(为了证明它可以工作,您可以在 Products 之后将 ToList() 调用填入其中,只要确保不要将类似的东西部署到生产中:)):

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class ScratchService : DataService<ScratchContext>


    [WebGet]
    public IQueryable<Product> FuzzySearch(string idStartsWith)
    
        var context = new ScratchContext();
        return context.Products.Where(p => p.ID.ToString().StartsWith(idStartsWith));
    
    // ...

这不是我们经常听到的问题,但我绝对可以在团队中提出这个问题,当我们开始 OASIS 标准化流程时,我们可以考虑这个问题。

【讨论】:

感谢您的回复!我将自己的自定义 WCF 数据服务与 EntityFramework 和 Sql Server 后端一起使用。我也能够做你上面提到的事情,这会很好,除了我也失去了我的 inlinecount url 选项。我的许多应用程序都需要它来向用户显示总结果,而无需再次调用来检索计数。我认为,如果服务方法能够采用常规实体查询所做的所有选项,那将是非常棒的。这样,如果您在前端构建通用数据访问组件,您可以使用任何一种。 这似乎是我们应用程序的常见请求,因为我们为内部客户编写业务应用程序,这些客户通常对直接查询他们正在寻找的订单或零件号非常感兴趣。给他们一个模糊搜索通常会有所帮助,因为 out ID 可能非常大,而且他们知道它在“8600 系列”或结果中。这些搜索通常在实时过滤组件中(按键启动搜索),因此在大 ID 上使用此功能可提供一致的用户过滤体验 您仍然可以在查询中使用 $inlinecount - 在我的例子中,URL 看起来像 localhost:59803/ScratchService.svc/…。肯定有其他系统查询选项您不能使用。

以上是关于OData:通配符(startswith)过滤 url 请求中的数字(ID)字段的主要内容,如果未能解决你的问题,请参考以下文章

扩展属性中的 Odata 过滤不起作用

使用 OData 枚举作为字段过滤网格

Angular JS 'Startswith' 自定义过滤器

如何允许将 Odata 选项应用于 cosmos db 集合并返回过滤后的记录

按包含过滤,然后按startsWith排序

Net Core:在洋葱架构中使用OData,将查询参数转换为Linq