2009-12-23 111 views
2

我想将自定义类作为参数传递给查询方法,该方法返回实体集合。我需要类似这样的东西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;} 
    public string FilterParam3 {get; set;} 
    public string FilterParam4 {get; set;} 
    public string FilterParam5 {get; set;} 
...and so on... 
} 

我试过在客户端使用共享代码使SearchParams类可用。但问题是没有操作(查询或调用)让我创建一个方法,我可以传递SearchParams类,因为它不是本机可序列化类型。 我在这样的SearchParams类中有大约15个属性。

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

+0

你使用VS2010/.NET 4吗?我相信可以构建一个复杂类型作为查询方法的参数。 – 2009-12-25 23:29:41

+0

不,我只使用VS2008/.NET 3.5。该产品必须在6个月内投入生产。 – 2009-12-28 19:40:14

回答

0

我想你错过了与查询方法整点:-)

Load方法,你用它来“执行”的查询方法采用Query作为参数。使用那个而不是使用你自己的“查询对象”。

例如是这样的:

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

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

你说得对。我只是错过了整个点 – 2009-12-24 17:21:10

+1

但是使用这个解决方案的问题是我使用自定义实体框架,并在那里使用存储过程。它将所有记录带到Web服务器,然后对其进行过滤。性能问题:(所以仍然是一个开放的问题 – 2009-12-25 03:17:30

0

正如弗雷德里克说,RIASvcs的要点之一是,你可以从客户端通过网络发送自定义查询(LINQ表达式),服务器,并在那里执行。

它将所有记录带到网络服务器,然后对它们进行过滤。

如果我理解正确的话,这不是true--带来了小提琴手,看看被发回的往复,这的确是筛选的服务器上,只有返回(到客户端)是什么要求。

+0

是的,我也同意你的看法,但我甚至不想将所有记录都带到服务器上,然后过滤它们,我只想在数据库级别进行过滤。可以通过发送很少的参数来实现,但在我的情况下,我有15个参数,我不想创建一个带15个参数的方法,我想创建一个自定义对象作为参数发送。 – 2009-12-28 20:52:27

0

如果您阅读Martin Fowler关于SOA的说法: 当您使用远程接口(例如远程门面(388))时,每次调用它都很昂贵。因此,您需要减少通话次数,这意味着您需要在每次通话时传输更多数据。 因此,您的问题只有一个答案,是的。 仅仅因为您想在客户端提供简单的语法,通过WCF公开像Expression或Func这样的复杂类型是没有意义的。 你有DataContract,用它来公开代表你的查询的Dto。

1

如果您准备在返回的实体上牺牲更改跟踪等,那么您可以改用“Invoke”方法。这将允许您将复杂类型作为参数传递(只要它们暴露给客户端)。

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

有关更多详细信息,请参阅此other question

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

相关问题