我如何将lambda表达式传递给WCF服务?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我目前的项目是使用IDesign架构,所以我所有的图层都是服务。我想让我的资源访问层的CRUD中的Read方法以lambda表达式的形式作为谓词以及相关对象的列表进行抽取。这样资源访问层将是非常通用的。

[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);

现在我已经发现了一些本该显而易见的事情,那就是我不能序列化lambda表达式。我研究了将一个字符串解析成一个lambda表达式,但这是不行的。

有什么方法可以用来将lambda表达式传递给服务?有没有更好的方法来做我想做的事情?

提问于
用户回答回答于

我们必须在LINQ-to-Just-About-Everything中解决这个问题。例如,在执行LINQ到SQL时:

var results = from c in customers where c.City == "London" select c.Name;

以某种方式,lambda表达式的内容,c=>c.City == "London"c=>c.Name需要以服务器可以理解的形式在SQL服务器上结束。显然,我们不能将lambda表达式持久保存到服务器上。

相反,我们将lambda表达式转换为表达式树,在运行时分析表达式树,从中构建实际的SQL字符串,并将该字符串发送到服务器进行处理。

你可以做同样的事情。为服务器创建一个查询语言。在客户端,将lambda表达式转换为表达式树。在运行时分析它们,将结果转换为查询语言中的字符串,然后将查询发送到服务。

如果对LINQ的工作方式感兴趣,LINQ-to-SQL架构师Matt Warren已经撰写了一系列关于如何自行完成的博客文章:

http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx

扫码关注云+社区