【问题标题】:Entity framework with OData(Web API) is sending Order By clause By default to Sql Query带有 OData(Web API)的实体框架默认发送 Order By 子句到 Sql Query
【发布时间】:2013-04-09 18:14:30
【问题描述】:

我将 Web Api 与 OData 一起使用。我在 EF 5.0 中定义了一个实体。
我正在向控制器发送非常简单的请求::

 $.ajax({url: "/odata/Details?$top=10",
            type: "GET",
            dataType: 'json',
            success: function (data) {
               viewModel.list(data.value);
            }

现在在我的控制器上编码::

 [Queryable]
    public override IQueryable<Area> Get()
    {  
    return db.Area.AsQueryable();
    }

我使用 SQL Profiler 看到的查询::

 SELECT TOP (@p__linq__1) 
[Project1].[id] AS [id1], 
[Project1].[name] AS [name1], 
[Project1].[pucrhase] AS [pucrhase1], 
[Project1].[sale] AS [sale1]
FROM Area
ORDER BY [Project1].[id] DESC, [Project1].[name] ASC, [Project1].[pucrhase] ASC,      
[Project1].[sale] ASC,N',@p__linq__1 int,@p__linq__1=10

我没有要求任何订购,按条款订购。 EF 自己将 ORDER BY 子句添加到 Query 中。添加的 Order By 子句包含表的所有列。该表有 300 万条记录,查询超时,因为它是按所有列排序。

我通过删除 Order By 进行了测试,不到一秒钟就完成了

所以问题是

如何阻止实体框架(支持 Web Api Odata)向 Sql Query 发送 Order By 子句。

如何从服务器上运行的 SQL 查询实体框架(Web Api Odata)中删除 Order By 子句?

感谢任何帮助。

【问题讨论】:

标签: entity-framework asp.net-web-api odata


【解决方案1】:

我不确定这是否是正确的答案,但我假设 odata 服务正在尝试通过对模型中的所有属性进行排序来保持稳定的排序顺序。

所以试试

[Queryable(EnsureStableOrdering=false)]

【讨论】:

  • 谢谢,感谢您的帮助。我还有一个问题 :) 它对我有用,比如这个 url:"/odata/Details?$top=10"
  • 如果我添加 Skip 参数来进行客户端分页和 [Queryable(EnsureStableOrdering=false] url: "/odata/Details?$top=10$skip=10" 。没有查询在服务器上运行。我没有看到在 Sql profiler 上运行任何查询。看起来实体框架没有向 Sql Server 发送任何查询。
  • 您能告诉我为什么 SKIP odata 参数不适用于 [Queryable(EnsureStableOrdering=false] 吗?
  • 我假设这实际上是因为如果您不能保证订单,$top 和 $skip 就没有意义。你为什么不默认按 id 或其他列排序。
  • 哇太好了 :) 非常感谢。你节省了我很多时间。
猜你喜欢
  • 2022-01-13
  • 2012-11-07
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多