我想将自定义类作为参数传递给查询方法,该方法返回一组实体。我需要这样的东西
[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个参数创建Query操作。 请建议有一个很好的解决方法。
答案 0 :(得分:1)
如果您准备在返回的实体上牺牲更改跟踪等,那么您可以使用“调用”方法。这将允许您将复杂类型作为参数传递(只要它们暴露给客户端)。
您可以通过编写返回复杂类型的虚拟查询方法来公开类型。
有关详细信息,请参阅此other question。
据我所知,将复杂类型作为参数传递给“查询”方法非常容易在路线图上,但目前无法使用。
答案 1 :(得分:0)
我认为你错过了查询方法的全部要点:-)
用于“执行”查询方法的Load
方法将Query
作为参数。使用那个而不是使用您自己的“查询对象”。
例如:
EntityQuery<YourEntity> query = from e in dx.GetYourEntityQuery()
where e.Foo == "something"
select e;
dx.Load<YourEntity>(query);
答案 2 :(得分:0)
正如弗雷德里克所说,RIASvcs的一个要点是你可以通过网络从客户端发送到服务器的自定义查询(LINQ表达式),然后在那里执行它。
它将所有记录带到Web服务器,然后过滤它们。
如果我理解正确,这不是真的 - 提起Fiddler,看看来回发送什么,它确实在服务器上过滤,只返回(向客户端)要求的内容。
答案 3 :(得分:0)
如果你读过Martin Fowler关于SOA的话: 当您使用远程接口(例如Remote Facade(388))时,每次调用都很昂贵。因此,您需要减少呼叫次数,这意味着您需要在每次呼叫时传输更多数据 所以你的问题只有一个答案,是的。 通过WCF公开复杂类型(如Expression或Func)是没有意义的,因为您想在客户端中提供简单的语法。 你有DataContract,用它来公开代表你的查询的Dto。