动态LINQ和动态Lambda表达式?
动态编写LINQ查询和Lambda表达式的最佳方法是什么?
我正在考虑最终用户可以设计业务逻辑规则的应用程序,然后必须执行这些规则。
很抱歉,如果这是一个新手问题,那么从经验中总结出最佳做法将是很棒的。
解决方案
我看到了两种可以动态生成lambda的方式。我们可以尝试Reflection.Emit直接生成IL(.Net字节码)并将其称为lambda,也可以使用System.CodeDom和Microsoft.CSharp.CSharpCodeProvider从更高级别的构造中生成代码。我们要做什么取决于我们希望用户如何输入这些内容。如果我们希望用户编写Cthen,则可以使用内置的编译器。
动态生成Linq应该更容易。我们应该能够在运行时将LINQ查询生成为表达式树,然后将它们传递到IQueryable中以执行。我建议我们查看有关IQueryable的文档,以了解有关此内容的更多信息。另一种方法是预定义几个linq查询,然后允许用户将它们链接在一起。这应该是可行的,因为任何Linq查询都返回一个IEnumerable,下一个Linq查询可以使用该IEnumerable。
另一种可能性是将脚本运行时集成到程序中,以便用户可以在DSL中编写业务逻辑。 IronPython将是候选人。
我不明白我们所说的"最佳方式"是什么意思。最好提供我们想要实现的简单示例。组成动态LINQ表达式并不难,但很棘手。
这是动态linq表达式创建的示例:
如何撰写现有的Linq表达式
可以通过System.Linq.Expressions命名空间轻松创建Lambda表达式。
我不建议我们阅读Bart De Smet(http://community.bartdesmet.net/blogs/bart/)的文章,对我们而言,他在Lambda方面确实非常出色。
他最近的系列文章涵盖了动态Lambda,从http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part开始-0.aspx
绝对漂亮的代码。
我们需要System.Linq.Expressions。我编写了一个不错的UI,它允许用户以表达式树的形式动态定义和构建查询。然后,我们可以将其交给Linq2SQL或者我们选择的客户端。