Предоставить IQueryable поверх службы WCF - PullRequest
12 голосов
/ 27 ноября 2010

Я узнал о IQueryable и отложенной загрузке / отложенном выполнении запросов.

Возможно ли выставить эту функцию через WCF? Я хотел бы предоставить сервис LINQ-to-SQL, который возвращает IQueryable, который затем я могу выполнить на клиенте с помощью дополнительных запросов и, наконец, выполнить с помощью .ToList (). Является ли формат OData применимым в этом контексте?

Если возможно, как называется этот метод и каковы хорошие уроки, которым я могу следовать? Спасибо.

Ответы [ 6 ]

11 голосов
/ 27 ноября 2010

Вы должны установить Службы данных WCF , которые позволят вам определить запрос Linq на клиенте. Службы данных WCF, вероятно, являются единственным решением для ваших требований.

IQueryable по-прежнему является только интерфейсом, и функциональность зависит от типа, реализующего интерфейс. Вы не можете напрямую выставлять запросы Linq-To-Sql или Linq-To-Entities. Существует несколько причин, таких как недолговечные контексты или сериализация, которые будут выполнять запрос, поэтому клиент получит список всех объектов вместо запроса.

1 голос
/ 27 сентября 2013

https://remotelinq.codeplex.com/ - другой выбор.Но он работает в AppDomain для сканирования текущих сборок и их сериализации.Эта технология не подходит для WinRT, так как нет доменов для WinRT App

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

Вы можете использовать http://interlinq.codeplex.com/, что позволяет отправлять запрос Linq через WCF.

Службы данных WCF могут использоваться только с webHttpBinding, и не все запросы Linq могут быть выражены. Написание запросов при использовании службы данных WCF не так привлекательно - требует строковых выражений, таких как:

.AddQueryOption("$filter", "Id eq 100");
1 голос
/ 27 ноября 2010

Насколько я знаю, текст данных не является сериализуемым, что означает, что вы не можете передать его с помощью WCF

0 голосов
/ 03 сентября 2013

Если возможно отправлять IQuerable <> через WCF, это не очень хорошо с точки зрения безопасности, поскольку IQuerable <> может предоставлять такие вещи, как строка подключения, к базе данных.Некоторые из предыдущих комментариев кажутся многообещающими.

0 голосов
/ 06 августа 2013

Я боролся с тем же вопросом и понял, что правильно сформулированный вопрос - это решаемая проблема.

IQueryable в основном служит для фильтрации запроса перед отправкой его на вызов вашей БД, поэтому вместо получения 1000записей и фильтрации только 10, вы получите эти 10 для начала.Эта фильтрация принадлежит вашему сервисному уровню, но если вы создаете API, я предполагаю, что вы сопоставите его с параметрами AND / OR в своем URL.

http://{host}/{entity}/q?name=john&age=21.

Таким образом, вы получите что-то вродеthis:

Filter:Column1=Value1 > http://{host}/{entity}q?column1=value1 >  SELECT *
                                                                  FROM  Entity
                                                                  WHERE Column1=Value1

MVC                   > WCF                                    >  DB

Вы можете найти очень хороший пример [ здесь ]

Наконец, поскольку ваша полезная нагрузка из WCF, скорее всего, будет JSON, вы можете(и должен) затем десериализовать их в ваших Доменных Моделях внутри коллекции.Это происходит до тех пор, пока не произойдет подкачка страниц, поэтому я бы порекомендовал некоторое кэширование WCF (и, поскольку это HTTP, это действительно просто).Вы по-прежнему будете использовать LINQ на стороне WebApp, просто без предложения «WHERE» LINQ (если вы не хотите динамически создавать URL-адрес, указанный выше?)

Для сложного запроса OR вы не возражаетенесколько запросов WCF (1 на «И»), а затем объединить их все вместе

...