【发布时间】:2008-09-22 09:47:20
【问题描述】:
动态编写 LINQ 查询和 Lambda 表达式的最佳方式是什么?
我正在考虑最终用户可以设计业务逻辑规则的应用程序,然后必须执行这些规则。
如果这是一个新手问题,我很抱歉,但是从经验中获得最佳实践会很棒。
【问题讨论】:
标签: linq .net-3.5 dynamic lambda
动态编写 LINQ 查询和 Lambda 表达式的最佳方式是什么?
我正在考虑最终用户可以设计业务逻辑规则的应用程序,然后必须执行这些规则。
如果这是一个新手问题,我很抱歉,但是从经验中获得最佳实践会很棒。
【问题讨论】:
标签: linq .net-3.5 dynamic 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 或您选择的客户端。
【讨论】:
我不明白您所说的“最佳方式”是什么意思。最好提供您想要实现的简单示例。编写动态 LINQ 表达式并不难,但很棘手。
这里是动态 linq 表达式创建的示例:
【讨论】: