【问题标题】:WCF Data Services IQueryable First() returns the whole list (verified with Fiddler). Why?WCF 数据服务 IQueryable First() 返回整个列表(使用 Fiddler 验证)。为什么?
【发布时间】:2012-03-19 18:22:49
【问题描述】:

我正在使用 .FirstOrDefault() 在返回的 Queryable 上尝试 .NET 中的 WCF 数据服务。但是当与 Fiddler 检查时,它仍然返回整个对象集。我必须做错什么?

代码真的很基础:

[OperationContract]
IQueryable<Note> Query();

[WebGet(UriTemplate = "")]
public IQueryable<Note> Query()
{
    return _source.OfType<Note>().AsQueryable<Note>();
}

Note note = _client.Query().FirstOrDefault();

这仍然会产生并通过网络传输所有笔记。

我错过了什么?

我什至可以将 IQueryable 和“远程 LINQ”与普通 WCF Web 服务一起使用吗?

我发现了一些示例,他们在本地使用 DataService(T) 和 DataServiceContext 作为客户端。我确实尝试过,但我根本没有让它工作。

我唯一需要的是这个“远程 LINQ”功能,这样我就可以通过 LINQ 查询我的 Web 服务,而不是仅在请求第一个项目时响应所有项目。

【问题讨论】:

  • 您的示例不是 wcf Ria 服务类型,wcf Ria 服务有不同的语法。

标签: .net wcf wcf-ria-services wcf-data-services iqueryable


【解决方案1】:

当您调用 FirstOrDefault() 时,您处于客户端,因此您将收到整个列表,您的客户端将对其进行过滤以仅获取第一个列表。如果您只想下载第一个元素,则需要一个特殊的 webMethod,如果您在服务器端执行 firstOrDefault。

[WebGet]
public Note QueryFirst()
{
    return _source.OfType<Note>().AsQueryable().FirstOrDefault();
}

【讨论】:

【解决方案2】:

我在使用 NETFx HttpEntityClient 使用 First() 时遇到了其他问题。使用 First() 时会抛出 NotSupportedException。

OData 不支持 First,但支持 Take 或 Skip。

这就是我最终不得不做的:

Note note = _client.Query().Take(1).ToArray().FirstOrDefault();

【讨论】:

  • 很难想象这与First()的工作方式有什么不同@
  • 我正在使用 NETFx HttpEntityClient,如果您尝试使用 First(),它将抛出 NotSupportedException。 OData 查询不支持 First()。由于 OData 支持 Take() 和 Skip(),因此您可以改用它们。我可以确认此代码确实按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多