2012-06-28 2 views
4

У меня очень большой набор данных (1,000,000+ клиентов) в наборе данных на удаленном компьютере. Эти данные хранятся в плоском файле и отображаются по номеру клиента, который является смещением в файле. Я хочу предоставить доступ к OData для этой коллекции, но я хочу только предложить возможность читать один объект.Предоставление oData Доступ к гигантскому набору данных без БД

Права доступа мудр легко получить WCF, чтобы ограничить его выделить читает со следующим:

config.SetEntitySetAccessRule("Customer", EntitySetRights.ReadSingle); 

У меня есть проблема в том, что я вынужден вернуть IQueryable интерфейс, который, кажется, требует, чтобы я понял, весь набор данных. Есть ли что-то, что мне не хватает, или есть способ собрать только записи, необходимые при оценке IQueryable, которые, как я знаю (из-за разрешений oData), потребуют одной записи?

+0

Это в стороне, но насколько широки ваши ряды? Я предполагаю, что этот набор данных будет тривиальным для загрузки в память (500 МБ?), Что вы должны учитывать в своем сценарии. Файловый ввод-вывод - огромный успех; большинство баз данных смягчают это, сохраняя горячие записи в памяти. –

ответ

1

IQueryable и IEnumerable очень разные - не вдаваясь в подробности, IQueryable позволяет создавать выражение запроса, которое выполняется поставщиком запроса (на сервере) и возвращает только результат (в вашем случае одиночный организация). Вы по-прежнему будете подвержены влиянию изучения всего набора данных на стороне сервера, но я не уверен, как вы могли бы избежать этого в своем сценарии.

См. Ответ здесь для более подробной информации о разнице между IEnumerable и IQueryable: https://stackoverflow.com/a/252789/981304. В частности, «... IQueryable допускает ненужные вещи, такие как удаленный источник данных, такой как база данных или веб-служба».

+0

Удивительный! Я создал класс, который реализует как IQueryable, так и IEnumerable. Когда вы запустите LINQ, он использует IQueryable для сбора части WHERE запроса, которая в этом случае является номером клиента. LINQ фактически не собирает данные, он просто собирает параметры запроса. Затем, когда вы создаете перечислитель, я собираю данные. На данный момент у меня есть доступ к условиям, поэтому я могу вернуть только результаты с сервера! Еще раз спасибо –

Смежные вопросы