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个参数的方法。我想创建一个自定义对象作为参数发送。