【问题标题】:Parsing a string C# LINQ expression解析字符串 C# LINQ 表达式
【发布时间】:2023-03-26 00:20:04
【问题描述】:

我正在尝试在这里进行一些真正的动态查询 - 不过最好不要在运行时调用编译器。

我有一个包含 LINQ 表达式的字符串,例如

var s = "from a in queryable where a.Type == 1 select a";

我怎样才能从中得到结果 IQueryable 或 Expressions?

我已经看到 LINQPad 和 RavenDb 都这样做了,所以我确信有办法,只是还没有找到。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    你有一些选择:

    1. 自己做一些事情,解析文本并构建表达式树。对此的标准方法是使用语言解析器来解析字符串(如ANTLR)。

    2. 使用 CodeDOM 编译查询(不推荐用于生产环境,因为这很慢,并且每次编译都会生成一个程序集,如果您执行很多操作,这将使您的 AppDomain 充满程序集。让我强调一下,不要这样做如果您有任何类型的音量,请路由 - 虽然这是 LINQPad 所做的) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

    3. 使用直接发出 MSIL 的 Mono 编译器(因此每次编译都不需要汇编,而且速度更快)-Mono Compiler as a Service (MCS)

    4. 使用动态 LINQ(有一些限制和限制,但基本上按照第 1 点中的建议进行操作,并且很好、轻量级,并且能够仅允许某些方法调用。它解析文本查询并构建一个表达式树) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    【讨论】:

    • #1 不实用。 #3 在 Microsoft CLR 下不起作用(尝试过......)。 #4 工作正常,但它有局限性。
    • 我要试试#3,我不久前在 Miguel de Icaza 的博客上读过一篇文章说 Mono.CSharp 现在可以在 MS CLR 上运行。
    • 数字 3 在 MS Windows CLR 下工作。尝试过,目前在生产中使用它。如果它给您带来问题,请查看我的帖子。凯文,如果你选择 3 号,请确保按照我链接到的帖子中的说明进行操作,否则你将无法使用 LINQ,并且每次编译时都会遇到与 CodeDom 相同的程序集问题。
    • 我将此标记为答案,谢谢。我正在与第 3 点作斗争 - 实际上让查询运行并让 IQueryable 回来。如果这不起作用,我将回到第 4 点。
    • 这也是一整天的战斗。但从那以后,它运作良好。这是我们当前的生产实现(已经完成了 4,然后是 2,然后是 1)。
    【解决方案2】:

    从“魔术字符串”到代码对象总是涉及到某种解析。在这种情况下,最好使用 EditableExpression 库(可从Google Code 免费获得)。获取您的字符串,并将其格式化为序列化一系列 EditableExpressions 的结果。然后,只需将其反序列化并转换为表达式树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2015-06-20
      • 2012-08-07
      相关资源
      最近更新 更多