Службы данных WCF IQueryable First () возвращает весь список (проверено с помощью Fiddler). Зачем? - PullRequest
1 голос
/ 19 марта 2012

Я пробую службы данных WCF в .NET с .FirstOrDefault () в возвращаемом Queryable.Но при проверке с помощью 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?

Я нашел несколько примеров, где онииспользовали DataService (T) и DataServiceContext локально в качестве клиента.Я пытался это сделать, но мне так и не удалось заставить его работать.

Единственное, что мне нужно, это функция "удаленного LINQ", чтобы я мог запрашивать свой веб-сервис через LINQ и не отвечать на все вопросы, когданапример, был запрошен только первый.

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Когда вы вызываете FirstOrDefault (), вы находитесь на стороне клиента, поэтому вы получите весь список, а ваш клиент отфильтрует его, чтобы получить только первый. Если вы хотите загрузить только первый элемент, вам понадобится специальный метод webMethod, в котором вы выполняете firstOrDefault на стороне сервера.

[WebGet]
public Note QueryFirst()
{
    return _source.OfType<Note>().AsQueryable().FirstOrDefault();
}
0 голосов
/ 04 декабря 2012

Я столкнулся с другими проблемами при использовании First () с использованием NETFx HttpEntityClient.Он генерирует NotSupportedException при использовании First ().

OData не поддерживает First, но поддерживает Take или Skip.

Это то, что мне пришлось сделать:

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