【问题标题】:IQueryable WebAPI service: why do I need to call .ToList()?IQueryable WebAPI 服务:为什么我需要调用 .ToList()?
【发布时间】:2012-02-14 06:02:59
【问题描述】:

我从上周离职的开发人员那里继承了这段代码。他的代码基于文章:
"Restful WCF / EF POCO / UnitOfWork / Repository / MEF".

此方法有效(当我浏览到 http://myapp/myservice/Returns 时):

[WebGet(UriTemplate = "Returns")]
public IQueryable<ReturnSnapshot> GetReturnSnapshots()
{
    using (UnitOfWork)
    {
        ReturnSnapshotsRepository.EnrolInUnitOfWork(UnitOfWork);
        return ReturnSnapshotsRepository.FindAll().ToList().AsQueryable();
    }
}

ToList() 不会导致整个表从存储库中拉出吗?我们将有 500K+ 行在生产中。

我想我可以把最后一行改成这样:

return ReturnSnapshotsRepository.FindAll();

FindAll 返回 IQueryable。但是,我的更改破坏了服务,现在出现 HTTP 12152 错误。

我该怎么办?

【问题讨论】:

  • 什么是“HTTP 12152 错误”?
  • ERROR_WINHTTP_INVALID_SERVER_RESPONSE 12152 无法解析服务器响应。 -- 从 Windows Server 2003 和带有 SP2 的 Windows XP 开始,WinHTTP 在 HTTP 响应中接受的最大标头数据量默认为 64K。如果服务器 HTTP 响应包含超过 64K 的总标头数据,WinHTTP 将失败请求并返回 ERROR_WINHTTP_INVALID_SERVER_RESPONSE 错误。
  • 为什么在执行查询之前处理你的工作单元?这对我来说看起来不对。

标签: c# entity-framework-4.1 wcf-web-api


【解决方案1】:

您应该能够从 WCF Web API REST 服务返回 IQueryable&lt;T&gt;。我怀疑 using 块会导致您的问题,因为一旦您从此方法返回但在执行实际数据库查询之前,就会处理 UnitOfWork。添加ToList() 解决了这个问题,但正如您所指出的,通过首先将所有内容加载到内存中来解决这个问题,所以不太理想。

【讨论】:

  • 完美。好吧,无论如何,乍一看:) 我摆脱了不必要的usingToList(),现在服务按预期工作。 SQLProfiler 显示正在发生延迟执行,即它尊重 $top=1 而不是拉入整个表。
【解决方案2】:

我不相信它可以通过 WCF 暴露,这可以进一步解释

Expose IQueryable Over WCF Service

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多