2012-07-23 91 views
1

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

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

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

回答

2

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

你在后端使用什么?这在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标准化进程这是我们可以考虑。

+0

谢谢您的回应!我使用自己的自定义WCF数据服务与EntityFramework和Sql Server后端。我也能够做到你上面提到的,这将工作很好,除了我然后失去了我的内联帐户的选项。我需要为我的许多应用程序显示用户的总体结果,而不需要再次调用回来以检索计数。我认为如果服务方法采用所有的常规实体查询所做的选择,那将是非常好的。这样,如果你在前端建立通用数据访问组件,你也可以使用它。 – muck41 2012-07-23 17:13:34

+1

这似乎是我们应用程序的常见要求,因为我们为我们的内部客户编写业务应用程序,这些客户通常非常有兴趣直接查询他们要查找的订单或部件号。给他们一个模糊的搜索通常是有帮助的,因为出ID可能很大,并且他们知道它是在“8600系列”或结果中。这些搜索通常在实时过滤组件中(密钥开始搜索),因此在大型ID上使用此功能可以获得一致的用户过滤体验 – muck41 2012-07-23 17:16:36

+0

您仍然可以在查询中使用$ inlinecount - 在我的情况下,该URL看起来像http://本地主机:59803/ScratchService.svc/FuzzySearch idStartsWith = '1' &$ inlinecount =所有页?。绝对有其他系统查询选项,你不能使用。 – 2012-07-23 20:15:13