2016-12-22 29 views
1

我有這樣的查詢,的OData是產生錯誤的URL或只是我用錯了關鍵字

https://example.com/_vti_bin/exampleService/exampleService.svc/Categories? 
$filter=Products/any(x:x/Status eq toupper('DELETED'))& 
$select=ID,Products/Status,Products/Title& 
$expand=Products 

但基於狀態它沒有過濾的數據集=刪除,並返回其具有的地位不會被刪除等產品。

我看着SQL跟蹤而這也帶來這樣的事情,

exec sp_executesql N'SELECT 
    [Project2].[C1] AS [C1], 
    [Project2].[C2] AS [C2], 
    [Project2].[C3] AS [C3], 
    [Project2].[ID] AS [ID], 
    [Project2].[C4] AS [C4], 
    [Project2].[C5] AS [C5], 
    [Project2].[C8] AS [C6], 
    [Project2].[ID1] AS [ID1], 
    [Project2].[C6] AS [C7], 
    [Project2].[C7] AS [C8], 
    [Project2].[Title] AS [Title], 
    [Project2].[Status] AS [Status] 
    FROM (SELECT 
     [Extent1].[ID] AS [ID], 
     1 AS [C1], 
     N''DataAccess.Product'' AS [C2], 
     N''ID'' AS [C3], 
     N''Products'' AS [C4], 
     N'''' AS [C5], 
     [Extent2].[ID] AS [ID1], 
     [Extent2].[Title] AS [Title], 
     [Extent2].[Status] AS [Status], 
     CASE WHEN ([Extent2].[ID] IS NULL) THEN CAST(NULL AS varchar(1)) ELSE N''DataAccess.Product'' END AS [C6], 
     CASE WHEN ([Extent2].[ID] IS NULL) THEN CAST(NULL AS varchar(1)) ELSE N''Title,Status,ID'' END AS [C7], 
     CASE WHEN ([Extent2].[ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C8] 
     FROM [dbo].[Categories] AS [Extent1] 
     LEFT OUTER JOIN [dbo].[Products] AS [Extent2] ON [Extent1].[ID] = [Extent2].[ProductID] 
     WHERE ([Extent1].[ClientID] = @p__linq__0) AND (EXISTS (SELECT 
      1 AS [C1] 
      FROM [dbo].[Products] AS [Extent3] 
      WHERE ([Extent1].[ID] = [Extent3].[ProductID]) AND (([Extent3].[Status] = (UPPER(N''DELETED''))) OR (([Extent3].[Status] IS NULL) AND (UPPER(N''DELETED'') IS NULL))) 
     )) 
    ) AS [Project2] 
    ORDER BY [Project2].[ID] ASC, [Project2].[C8] ASC',N'@p__linq__0 int',@p__linq__0=23 

是否正確使用「EQ」如果我只想產品,其狀態爲「已刪除」並沒有什麼Ë lse?

編輯

我使用的OData V3,使用WCF數據服務與EF

+0

你是否在'Status'而不是'toupper('DELETED')'上使用'toupper'? http://www.odata.org/documentation/odata-version-2-0/uri-conventions/#FilterSystemQueryOption –

+0

@ Pierre-LoupPagniez對不起,我沒有得到你?但只是添加,即使我刪除「toupper」的結果是相同的 – Mathematics

+0

我的意思是:我認爲你現在正在比較你的'Status'和'DELETED'的大寫版本,它已經是大寫。例如,如果您的「狀態」等於「dELeteD」,則您的比較不起作用。我相信你需要在'Status'上將你的呼叫轉移到'toupper',比如'Products/any(x:toupper(x/Status)eq'DELETED')'。雖然我不確定語法,但我沒有任何方法來測試我寫的內容,因此您可能需要稍稍移動'toupper'。 –

回答

1

我相信這個問題是在查詢中。 表格你說像網址...

// get me categories 
https://example.com/_vti_bin/exampleService/exampleService.svc/Categories? 

// where any product is deleted 
$filter=Products/any(x:x/Status eq toupper('DELETED'))& 

// return the category id, product status and title 
$select=ID,Products/Status,Products/Title& 
$expand=Products 

換句話說,你是被刪除的狀態過濾類別中他們不是產品。 您可以添加第二個過濾器來處理產品過濾,並僅返回類別及其過濾後的一組產品。

嘗試這樣的事情,而不是...

https://example.com/_vti_bin/exampleService/exampleService.svc/Categories? 
$filter=Products/any(x:x/Status eq toupper('DELETED'))& 
$select=ID,Products/Status,Products/Title& 
$expand=Products/any(p:p/Status eq toupper('DELETED')) 

根據您的情況可能是最好的轉身查詢...

https://example.com/_vti_bin/exampleService/exampleService.svc/Products? 
$filter=Status eq toupper('DELETED')& 
$select=Category/ID,Status,Title 

...通過拉一組產品和他們的相關類別Id,您會得到相同的結果,但可以直接在基本查詢上過濾這些產品,而不是使用更復雜的子集合過濾器。

正如在聊天中所討論的那樣,這確實需要一個有效的OData模型,其中產品和類別之間的關係被正確定義。

+0

謝謝,我試過了,但得到這個錯誤 - Term'Products($ filter = any(p:p/Status eq'DELETED'))'在$ select或$ expand表達式中無效。 – Mathematics