2012-07-23 92 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