WCF RIA Services - передача пользовательского объекта в метод запроса в качестве параметра - PullRequest
2 голосов
/ 23 декабря 2009

Я хочу передать пользовательский класс в качестве параметра методу запроса, который возвращает мне набор сущностей. Мне нужно что-то вроде этого

[Query]
public IEnumerable<MyEntity> Search(SearchParams params)
{
 //do something here
}

public class SearchParams
{
  public string FilterParam1 {get; set;}
  public string FilterParam2 {get; set;}
  public string FilterParam3 {get; set;}
  public string FilterParam4 {get; set;}
  public string FilterParam5 {get; set;}
...and so on...
}

Я попытался сделать класс SearchParams доступным на стороне клиента с помощью общего кода. Но проблема в том, что никакая операция (запрос или вызов) не позволяет мне создать метод, в котором я могу передать класс SearchParams, поскольку он не является собственным сериализуемым типом. У меня есть около 15 свойств в классе SearchParams, как это.

Я не хочу создавать операцию Query с 15 параметрами. Пожалуйста, предложите, есть ли хороший обходной путь для этого.

Ответы [ 4 ]

1 голос
/ 23 июля 2011

Если вы готовы пожертвовать отслеживанием изменений и т. Д. На возвращенных объектах, вы можете вместо этого использовать метод Invoke. Это позволит вам передавать сложные типы в качестве параметров (если они доступны клиенту).

Вы можете предоставить тип, написав фиктивный метод запроса, который возвращает ваш сложный тип.

Подробнее см. * .

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

0 голосов
/ 28 декабря 2009

Как сказал Фредерик, одним из основных моментов RIASvcs является то, что вы можете отправлять пользовательский запрос (выражение LINQ) по кабелю от клиента на сервер и выполнять его там.

Он переносит все записи на веб-сервер и затем фильтрует их.

Если я вас правильно понимаю, это не так - вызовите Fiddler и посмотрите, что отправляется туда-сюда, это действительно фильтрует на сервере и только возвращает (клиенту) то, что было запрошено.

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

Если вы читаете, что говорит Мартин Фаулер о SOA: Когда вы работаете с удаленным интерфейсом, таким как Remote Facade (388), каждый его вызов обходится дорого. В результате вам нужно уменьшить количество вызовов, а это значит, что вам нужно передавать больше данных с каждым вызовом Так что на ваш вопрос есть только один ответ, да. Не имеет смысла выставлять сложный тип, такой как Expression или Func, через WCF только потому, что вы хотите предоставить простой синтаксис в клиенте. У вас есть DataContract, используйте его для предоставления Dto, представляющего ваш запрос.

0 голосов
/ 24 декабря 2009

Я думаю, что вы пропустили всю суть метода Query :-)

Метод Load, который вы используете для «выполнения» метода запроса, принимает в качестве аргумента Query. Используйте это вместо того, чтобы использовать свой собственный «объект запроса».

Например, что-то вроде этого:

EntityQuery<YourEntity> query = from e in dx.GetYourEntityQuery()
                                where e.Foo == "something"
                                select e;

dx.Load<YourEntity>(query);
...