Вопрос

Проблемы с фильтрацией данных в запросе odata через wcf

Добрый день!
У нас возникли проблемы с фильтрацией получаемых через odata данных.
Мы пробовали несколько вариантов:
client.AccountCollection.Where(x => x.CgrDistributorId == DistributorId).ToList();

также через LINQ:
var result = from account in (client.AccountCollection as IQueryable)
where account.CgrDistributorId == DistributorId
select account;
result.ToList();
Эти варианты выдают ошибку "Элемент коллекции с именем CgrDistributorId не найден", хотя данная колонка есть. Мы обновляли ServiceReference, а данные из неё получаються если загрузить список не используя фильтр.

работает только:
client.AccountCollection.ToList().Where(x => x.CgrDistributorId == DistributorId).ToList();
Но он не подходит, т.к. он перед фильтрацией подгружает весь список и фильтрует данные уже в ОЗУ, что не корректно.

У меня такой же вопрос

1 комментарий

Здравствуйте!

Выполните фильтрацию в самом обращение к ODATA:
using (var response = (HttpWebResponse)authRequest.GetResponse()) {
// Создание запроса на получение данных от сервиса OData.
//var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=Id, Name, Gender&$expand=Gender&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=*&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
// Для получения данных используется HTTP-метод GET.
dataRequest.Method = "GET";
// Добавление полученных ранее аутентификационных cookie в запрос на получение данных. ,Products&$expand=Products/Suppliers
dataRequest.CookieContainer = bpmCookieContainer;
// Получение ответа от сервера.
using (var dataResponse = (HttpWebResponse)dataRequest.GetResponse()) {
// Загрузка ответа сервера в xml-документ для дальнейшей обработки.
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
// Получение коллекции объектов контактов, соответствующих условию запроса.
var contacts = from entry in xmlDoc.Descendants(atom + "entry")
select new {
Id = new Guid(entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Id").Value),
Name = entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Name").Value
};
foreach (var contact in contacts) {
// Выполнение действий с контактами.
}
}
}

Войдите или зарегистрируйтесь, чтобы комментировать