【发布时间】:2016-12-22 08:37:35
【问题描述】:
我有一个这样的查询,
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
但它不是根据 status = deleted 过滤数据集并返回状态未删除等的产品。
我查看了 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”是否正确?
编辑
我正在使用 OData V3,将 WCF 数据服务与 EF 一起使用
【问题讨论】:
-
您的意思是在
Status上使用toupper而不是toupper('DELETED')? odata.org/documentation/odata-version-2-0/uri-conventions/… -
@Pierre-LoupPagniez 对不起,我没有得到你?但即使我删除“toupper”结果也是一样的
-
我的意思是:我认为您现在正在将您的
Status与DELETED的大写版本进行比较,后者已经是大写的。例如,如果您的Status等于dELeteD,则您的比较将不起作用。我相信您需要在Status上将您的电话转至toupper,例如Products/any(x:toupper(x/Status) eq 'DELETED')。不过我不确定语法,我没有办法测试我写的东西,所以你可能需要移动toupper一点。 -
@Pierre-LoupPagnez 所有数据库记录都已经是大写了
-
哦,那我不知道,抱歉。
标签: entity-framework linq wcf sql-server-2012 odata