我当前的项目使用的是IDesign架构,所以我所有的层都是服务。我想让资源访问层CRUD中的Read方法接受lambda表达式形式的谓词,以及要拉取的相关对象列表。这样,资源访问层将非常通用。
[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);
现在我发现了一件很明显的事情,那就是我不能序列化lambda表达式。我研究了将字符串解析为lambda表达式,但这也是行不通的。
有没有什么方法可以用来将lambda表达式传递给服务?有没有更好的方法来做我想做的事情?
发布于 2011-06-23 01:12:26
也许动态查询在您的情况下可以工作?
您可以将where子句字符串传递给服务,该服务将对其进行验证并将其转换为表达式
发布于 2011-06-23 01:17:05
我们必须在LINQ中解决这个问题。例如,在执行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 server上结束。显然,我们不能将lambda持久化到服务器。
相反,我们要做的是将lambda转换为表达式树,在运行时分析表达式树,从中构建一个实际的SQL字符串,并将该字符串发送到服务器进行处理。
你可以做同样的事情。为您的服务器创建查询语言。在客户端,将lambda转换为表达式树。在运行时对它们进行分析,将结果转换为查询语言中的字符串,然后将查询发送到服务。
如果你对它在LINQ中的工作原理感兴趣,LINQ- to -SQL架构师Matt Warren已经写了一长串关于如何自己做这件事的博客文章:
http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx
发布于 2011-06-23 01:21:51
我在CodePlex上使用this库来序列化/反序列化表达式树(但它是它的前一个版本),它可以完成这项工作。
这里还有其他一些类似的问题:Serializing and Deserializing Expression Trees in C#
https://stackoverflow.com/questions/6443433
复制相似问题