Выполнение существующего запроса LINQ для динамического объекта (например, DataTable) - PullRequest
2 голосов
/ 22 марта 2010

Я работаю над универсальным провайдером OData, чтобы пойти против обычного провайдера данных, который у нас здесь. Это полностью динамично в том, что я запрашиваю у поставщика данных таблицу, которую он знает. У меня есть базовая структура хранения, основанная на примере кода OData.

Моя проблема в том, что OData поддерживает запросы и ожидает от меня реализации IQueryable. С другой стороны, у меня нет поддержки запросов. Не шутка - провайдер возвращает таблицы и предложение WHERE не поддерживается. Производительность здесь не проблема - таблицы маленькие. Сортировать их можно в провайдере OData.

Моя главная проблема заключается в следующем.

  • Я отправляю инструкцию SQL, чтобы получить данные таблицы. Результатом является своего рода устройство чтения данных ADO.NET.
  • Мне нужно предоставить реализацию IQueryable для этих данных, чтобы потенциально разрешить последующую фильтрацию.

Есть идеи, как лучше всего это коснуться? Только для .NET 3.5 (4.0 не планируется в течение некоторого времени). Я серьезно думал о создании динамических классов DTO для каждой таблицы (с использованием байт-кода), чтобы я мог использовать стандартный LINQ. Сейчас я использую словарь для каждой записи (не слишком эффективный), но я не вижу реального способа фильтрации / сортировки по ним.

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Если вы в порядке с выполнением запроса внутри вашего провайдера OData, вы можете просто загрузить свои данные в список T (T является типом объекта), а затем просто вернуть list.AsQueryable (). Это вернет запрос LINQ to Objects, который обеспечивает полную поддержку всех параметров запроса и основан на хранении в памяти (список). Обратите внимание, что для правильной работы ваш IDataServiceQueryProvider.IsNullPropagationRequired должен возвращать true (поскольку LINQ to Objects требует, чтобы значения null были правильно переданы через запрос). Кроме того, если вы установите в любом месте CanReflectOnInstanceProperty значение false, вам потребуется выполнить некоторую переписывание запроса. Если это так, посмотрите на этот пост здесь для объяснения того, как осуществляется доступ к свойствам.

0 голосов
/ 22 марта 2010

Пабло Кастро, один из главных участников OData, говорит, что предоставление услуги OData без возможности запросов полностью соответствует их намерениям. См. это сообщение в блоге.

Это одна из причин, по которой мне бы очень хотелось, чтобы они добавили ссылку «поиск» в ответе OData, чтобы клиентское приложение могло определить, были ли доступны возможности запросов. Что-то вроде OpenSearch.

<Link rel="search" type="application/ODataQuery+xml" href="QueryMetadata.xml"/>

Таким образом, клиент может легко обнаружить, реализован поиск или нет.

...