Lambda表达式和存储过程

4

我正在尝试模仿LINQ Where扩展方法来编写我的ADO.NET DAL方法。

基本上,我的目标是拥有一个可以调用的单一方法。例如:

Product p = Dal.GetProduct(x => x.ProductId == 32);
Product p2 = Dal.GetProduct(x => x.ProductName.Contains("Soap"));
我希望您能够剖析这些谓词,并将过滤选项发送到ADO.NET存储过程调用中的参数中。 非常感谢您的任何评论。

3
这是一项可观的任务。你考虑过使用Linq2Sql或Linq2NHibernate(即使用现成的DAL / ORM)吗? - Daniel Renshaw
2个回答

9
正如 @Daniel 所指出的,这远非简单。解决方案概述是让 GetProduct 接受一个类型为 Expression<Func<Product, bool>> 的参数。然后您必须遍历此表达式的解析树,生成已知函数的正确 SQL,并决定如何处理未知函数。基本上有两个选项:

  1. 抛出错误(如 linq-to-sql 所做)。
  2. 在翻译中跳过它,然后在返回的结果上应用它。如果检索了大量数据仅用于筛选,则可能会对性能产生巨大影响。

这将是一个有趣的练习 - 但当已经有 linq2sql、linq2entities 和 linq2NHibernate 完成工作时,我几乎无法想象在现实世界中证明其存在的方法。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,