我正在尝试模仿我的ADO.NET DAL方法的LINQ Where扩展方法。
基本上,我的目标是有一个我可以打电话的方法。如:
Product p = Dal.GetProduct(x => x.ProductId == 32);
Product p2 = Dal.GetProduct(x => x.ProductName.Contains("Soap"));
然后我想剖析那些Predicates并将过滤器选项发送到ADO.NET存储过程调用中的参数。
任何评论都非常感谢。
答案 0 :(得分:9)
正如@Daniel指出的那样,这远非简单。解决方案大纲是让GetProduct
采用Expression<Func<Product, bool>>
类型的参数。然后,您必须遍历此表达式的解析树,为已知函数生成正确的SQL,并决定如何处理未知函数。基本上有两种选择:
这样做会很有趣 - 但是在现实世界中,当已经有linq2sql,linq2entities和linq2NHibernate完成这项工作时,我几乎看不到一种方法可以证明这一点。
答案 1 :(得分:4)
除了Anders的回答之外,我只想提一下你可以使用表达式访问者来分析表达式树。为此,您可以继承ExpressionVisitor
类(它是.NET 4中的新类,但您可以在LinqKit中找到3.5实现)并覆盖您想要分析每个节点的方法。
您可能也对这些链接感兴趣: