Lambda表达式和存储过程

时间:2010-05-18 18:14:11

标签: c# database lambda

我正在尝试模仿我的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存储过程调用中的参数。

任何评论都非常感谢。

2 个答案:

答案 0 :(得分:9)

正如@Daniel指出的那样,这远非简单。解决方案大纲是让GetProduct采用Expression<Func<Product, bool>>类型的参数。然后,您必须遍历此表达式的解析树,为已知函数生成正确的SQL,并决定如何处理未知函数。基本上有两种选择:

  1. 抛出错误(正如linq-to-sql所做的那样)。
  2. 在翻译中跳过它,然后将其应用于返回的结果。如果大量数据只是被过滤掉,那么这对性能的影响当然是巨大的。
  3. 这样做会很有趣 - 但是在现实世界中,当已经有linq2sql,linq2entities和linq2NHibernate完成这项工作时,我几乎看不到一种方法可以证明这一点。

答案 1 :(得分:4)

除了Anders的回答之外,我只想提一下你可以使用表达式访问者来分析表达式树。为此,您可以继承ExpressionVisitor类(它是.NET 4中的新类,但您可以在LinqKit中找到3.5实现)并覆盖您想要分析每个节点的方法。

您可能也对这些链接感兴趣: