动态编写 LINQ 查询和 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
绝对漂亮的代码。
另一种可能性是将脚本运行时集成到您的程序中,以便您的用户可以在 DSL 中编写业务逻辑。IronPython将是候选人。
我可以看到两种动态生成 lambda 的方法。您可以尝试 Reflection.Emit 直接生成 IL(.Net 字节码)并将它们作为 lambda 调用,或者您可以使用 System.CodeDom 和 Microsoft.CSharp.CSharpCodeProvider 从更高级别的构造生成代码。您想要做什么取决于您希望用户如何输入这些内容。如果您希望用户编写 C#,那么您可以使用内置的编译器。
动态生成 Linq 应该更容易。您应该能够在运行时将 LINQ 查询生成为表达式树,然后将它们传递给 IQueryable 以执行。我建议您查看有关 IQueryable 的文档以了解更多信息。另一种方法是预先定义几个 linq 查询,然后允许用户将它们链接在一起。这应该是可行的,因为任何 Linq 查询都会返回一个 IEnumerable,可以由下一个 Linq 查询使用。
可以通过 System.Linq.Expressions 命名空间轻松创建 Lambda 表达式。
System.Linq.Expressions是您所需要的。我编写了一个不错的 UI,它允许用户以表达式树的形式动态定义和构建查询。然后,您可以将其交给 Linq2SQL 或您选择的客户端。