WCF数据服务IQueryable First()返回整个列表(使用Fiddler验证)。为什么?

时间:2012-03-19 18:22:49

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

我正在使用返回的Queryable上的.FirstOrDefault()尝试.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服务,而不是只响应所有项目,例如,只请求第一个。

2 个答案:

答案 0 :(得分:2)

当你调用FirstOrDefault()时,你在客户端,所以你将收到整个列表,你的客户将过滤它只获得第一个。如果你只想下载第一个元素,你需要一个特殊的webMethod你在服务器端做firstOrDefault。

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

答案 1 :(得分:0)

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

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

这是我最终要做的事情:

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