私は、ODataの5.8.0と6.1.3 EntityFramework、クエリを使用しています:〜20をとる悪いのODataエンティティフレームワークとトップとパフォーマンスとのOrderBy
SELECT TOP (10)
[Project1].[FieldA] AS [FieldA],
[Project1].[FieldB] AS [FieldB],
FROM (SELECT [Project1].[FieldA] AS [FieldA], [Project1].[FieldB] AS [FieldB], row_number() OVER (ORDER BY [Project1].[FieldB] DESC, [Project1].[FieldA] ASC) AS [row_number]
FROM (SELECT
[Extent1].[FieldA] AS [FieldA],
[Extent1].[FieldB] AS [FieldB],
FROM [dbo].[table] AS [Extent1]
WHERE ([Extent1].[FieldA] = 'ABCDEFG') OR (([Extent1].[FieldA] IS NULL) AND ('ABCDEFG' IS NULL))
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[FieldB] DESC, [Project1].[FieldA] ASC
:中
&$filter=fieldA eq 'ABCDEFG'&$skip=0&$top=10&$orderby=fieldB desc
結果
:私は同じLINQを使用する場合は、フィールドA.の大量のためのDBに対して実行する秒実行するために120msのを取る
SELECT
[Limit1].[FieldA] AS [FieldA],
[Limit1].[FieldB] AS [FieldB]
FROM (SELECT [Limit1].[FieldA] AS [FieldA], [Limit1].[FieldB] AS [FieldB], row_number() OVER (ORDER BY [Limit1].[FieldB] DESC) AS [row_number]
FROM (SELECT TOP (10) [Project1].[FieldA] AS [FieldA], [Project1].[FieldB] AS [FieldB]
FROM (SELECT
[Extent1].[FieldA] AS [FieldA],
[Extent1].[FieldB] AS [FieldB]
FROM [dbo].[table] AS [Extent1]
WHERE ([Extent1].[FieldA] = 'ABCDEFG') OR (([Extent1].[FieldA] IS NULL) AND ('ABCDEFG' IS NULL))
) AS [Project1]
ORDER BY [Project1].[FieldB] DESC
) AS [Limit1]
) AS [Limit1]
WHERE [Limit1].[row_number] > 0
ORDER BY [Limit1].[FieldB] DES
:
それはになります。
は、どのように私は(外文でTOPを使用しない、すなわち)のODataは同じ表現を使用するように強制するのですか?
'$ skip'フィルタと' $ top'フィルタの順序を変更すると違いはありますか? '$ skip'述語を削除できますか? あなたはそれがEF ...提案のための – Nikita
おかげと同じように動作させるためにODataのでプレーする必要があります - 違いはありませんでしたありませんが、私は私が望む方法でODATA作品を作るために管理してお答えします私が使ったものとの質問。私はODataのバグにこの境界を感じます。 – Tim
うん、バウンスのように聞こえる、どんな場合でも外側選択の 'TOP'は悪いです。そして、その追加のORDER BYステートメント... – Nikita