Silverlight WCF RIA服务-将自定义对象作为参数传递给查询方法

Silverlight WCF RIA服务-将自定义对象作为参数传递给查询方法,silverlight,wcf-ria-services,Silverlight,Wcf Ria Services,我想将一个自定义类作为参数传递给查询方法,该方法返回一个实体集合。我需要这样的东西 [Query] public IEnumerable<MyEntity> Search(SearchParams params) { //do something here } public class SearchParams { public string FilterParam1 {get; set;} public string FilterParam2 {get; set;}

我想将一个自定义类作为参数传递给查询方法,该方法返回一个实体集合。我需要这样的东西

[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类在客户端可用。但问题是,没有operationquery或invoke允许我创建一个方法,在该方法中我可以传递SearchParams类,因为它不是本机可序列化类型。 我在SearchParams类中有大约15个这样的属性

我不想创建带有15个参数的查询操作。
请建议有一个很好的解决方法。

我认为您没有抓住查询方法的要点:-

用于执行查询方法的Load方法将查询作为参数。使用该查询对象,而不是使用自己的查询对象

例如,类似这样的事情:

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

dx.Load<YourEntity>(query);

正如Frederick所说,RIASvcs的一个要点是,您可以通过网络将自定义查询LINQ表达式从客户端发送到服务器,并在那里执行

它将所有记录带到web服务器,然后过滤它们


如果我理解正确,这不是真的-打开Fiddler,看看来回发送的是什么,它确实在服务器上进行过滤,只向客户端返回请求的内容。

如果您阅读Martin Fowler关于SOA的内容: 当您使用远程接口(如RemoteFacade388)时,对它的每次调用都很昂贵。因此,您需要减少通话次数,这意味着您需要在每次通话中传输更多数据 所以你的问题只有一个答案,是的。 仅仅因为希望在客户端中提供简单语法,就通过WCF公开复杂类型(如表达式或Func)是没有意义的。
您拥有DataContract,使用它来公开表示查询的Dto。

如果您准备牺牲对返回实体的更改跟踪等,则可以使用“调用”方法。这将允许您将复杂类型作为参数传递,只要它们向客户端公开即可

您可以通过编写一个返回复杂类型的伪查询方法来公开该类型

有关更多详细信息,请参见此


据我所知,将复杂类型作为参数传递给“查询”方法的能力已在路线图上,但目前还不可用。

但使用此解决方案的问题是,我使用的是自定义实体框架,它使用的是存储过程。它将所有记录带到web服务器,然后过滤它们。性能命中:。所以这仍然是一个悬而未决的问题,您是否使用VS2010/.NET4?我相信可以构造一个复杂类型作为查询方法的参数。不,我只使用VS2008/.NET3.5。产品必须在6个月内投产。是的,我也同意你的看法。但我甚至不想把所有的记录带到服务器上,然后过滤它们。我只想在数据库级别过滤它们。我可以通过发送几个参数来实现这一点,但在我的例子中,我有15个参数。我不想创建一个带有15个参数的方法。我想创建一个自定义对象作为参数发送。