- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我当前的项目使用的是 IDesign 架构,所以我所有的层都是服务。我想让资源访问层的 CRUD 中的 Read 方法采用 lambda 表达式形式的谓词以及要提取的相关对象列表。这样资源访问层就会非常通用。
[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);
现在我发现了一些本来应该很明显的事情,那就是我无法序列化 lambda 表达式。我研究过将字符串解析为 lambda 表达式,但这也是行不通的。
有什么方法可以用来将 lambda 表达式传递给服务吗?有没有更好的方法来完成我想做的事情?
最佳答案
我们必须在 LINQ-to-Just-About-Everything 中解决这个问题。例如,在执行 LINQ-to-SQL 时:
var results = from c in customers where c.City == "London" select c.Name;
lambdas 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
关于c# - 如何将 lambda 表达式传递给 WCF 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6443433/
我是一名优秀的程序员,十分优秀!