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

Ale*_*lec 16 .net c# wcf

我目前的项目是使用IDesign架构,所以我的所有层都是服务.我希望在我的资源访问层的CRUD中使用我的Read方法以lambda表达式的形式获取谓词以及要拉取的相关对象列表.这样,资源访问层将非常通用.

[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);
Run Code Online (Sandbox Code Playgroud)

现在我已经发现了一些应该是显而易见的事情,那就是我无法序列化lambda表达式.我研究了将字符串解析为lambda表达式,但这也是不行的.

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

Eri*_*ert 25

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

var results = from c in customers where c.City == "London" select c.Name;
Run Code Online (Sandbox Code Playgroud)

莫名其妙的lambda表达式的内容c=>c.City == "London"c=>c.Name需要结束了在服务器能够理解的形式在SQL服务器上.显然我们不能将lambda保存到服务器上.

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

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

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

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


Jas*_*zek 6

也许动态查询可以适用于您的情况?

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

您可以将where子句字符串传递给服务,该服务将验证并将其转换为表达式