【问题标题】:Dynamic LINQ and Dynamic Lambda expressions?动态 LINQ 和动态 Lambda 表达式?
【发布时间】:2008-09-22 09:47:20
【问题描述】:

动态编写 LINQ 查询和 Lambda 表达式的最佳方式是什么?

我正在考虑最终用户可以设计业务逻辑规则的应用程序,然后必须执行这些规则。

如果这是一个新手问题,我很抱歉,但是从经验中获得最佳实践会很棒。

【问题讨论】:

    标签: linq .net-3.5 dynamic lambda


    【解决方案1】:

    我不能比你更推荐阅读 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 开始

    绝对漂亮的代码。

    【讨论】:

      【解决方案2】:

      另一种可能性是将脚本运行时集成到您的程序中,以便您的用户可以在 DSL 中编写业务逻辑。 IronPython 将成为候选人。

      【讨论】:

      • 中肯的建议。我们这样做是为了配置工作流,效果很好。
      • 唯一的缺点是您可能会遇到完全/部分信任的问题,这会阻止您的代码在 asp.net 中执行
      【解决方案3】:

      我可以看到两种动态生成 lambda 的方法。您可以尝试 Reflection.Emit 直接生成 IL(.Net 字节码)并将它们作为 lambda 调用,或者您可以使用 System.CodeDom 和 Microsoft.CSharp.CSharpCodeProvider 从更高级别的构造生成代码。您想要做什么取决于您希望用户如何输入这些内容。如果您希望用户编写 C#,那么您可以使用内置的编译器。

      动态生成 Linq 应该更容易。您应该能够在运行时将 LINQ 查询生成为表达式树,然后将它们传递给 IQueryable 以执行。我建议您查看有关 IQueryable 的文档以了解更多信息。另一种方法是预先定义几个 linq 查询,然后允许用户将它们链接在一起。这应该是可行的,因为任何 Linq 查询都会返回一个 IEnumerable,可供下一个 Linq 查询使用。

      【讨论】:

        【解决方案4】:

        可以通过 System.Linq.Expressions 命名空间轻松创建 Lambda 表达式。

        【讨论】:

          【解决方案5】:

          System.Linq.Expressions 是您所需要的。我编写了一个不错的 UI,它允许用户以表达式树的形式动态定义和构建查询。然后,您可以将其交给 Linq2SQL 或您选择的客户端。

          【讨论】:

            【解决方案6】:

            我不明白您所说的“最佳方式”是什么意思。最好提供您想要实现的简单示例。编写动态 LINQ 表达式并不难,但很棘手。

            这里是动态 linq 表达式创建的示例:

            How do I compose existing Linq Expressions

            【讨论】:

            • 我不知道此类事情的“最佳实践”。我知道如何解决具体问题,但一般的“最佳方法”太模糊了。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多