Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析字符串C#LINQ表达式_C#_Linq - Fatal编程技术网

解析字符串C#LINQ表达式

解析字符串C#LINQ表达式,c#,linq,C#,Linq,我试图在这里进行一些真正的动态查询——最好不要在运行时调用编译器 我有一个包含LINQ表达式的字符串,例如 var s = "from a in queryable where a.Type == 1 select a"; 如何从中获得结果IQueryable或表达式 我见过LINQPad和RavenDb都这样做,所以我相信有一种方法,我只是还没有找到。你有一些选择: 做一些自主开发的事情,解析文本并构建表达式树。实现这一点的标准方法是使用语言解析器来解析字符串(如) 使用CodeDOM编译查

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

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

var s = "from a in queryable where a.Type == 1 select a";
如何从中获得结果IQueryable或表达式

我见过LINQPad和RavenDb都这样做,所以我相信有一种方法,我只是还没有找到。

你有一些选择:

  • 做一些自主开发的事情,解析文本并构建表达式树。实现这一点的标准方法是使用语言解析器来解析字符串(如)

  • 使用CodeDOM编译查询(不建议在生产环境中使用,因为这很慢,每次编译都会生成一个程序集,如果你做了很多程序集,它会让AppDomain中的程序集饱和。我要强调的是,如果你有任何类型的卷,就不要走这条路——尽管这是LINQPad所做的)——

  • 使用Mono的编译器,它直接发出MSIL(因此每次编译没有程序集,速度更快)——

  • 使用动态LINQ(有一些限制和限制,但基本上按照第#1点中的建议执行,并且很好、轻量级,并且只允许某些方法调用。它解析文本查询并从中构建表达式树)——


  • 从“神奇字符串”到代码对象总是涉及某种解析。在这种情况下,最好使用EditableExpression库(免费提供)。获取字符串,并将其格式化为序列化一系列可编辑表达式的结果。然后,简单地将其反序列化并转换为表达式树。

    #1不实用#3在Microsoft CLR下不工作(已尝试…)#4可以正常工作,但也有局限性。我将尝试3,我不久前在Miguel de Icaza的博客上读到一篇文章,Mono.CSharp现在可以在MS CLR上工作。3可以在MS Windows CLR下工作。已试用,目前正在生产中使用。如果它给你提供了问题,请查看我在上面的帖子。Kevin,如果你选择3号,请确保你按照我链接到的帖子中的说明进行操作,否则你将无法使用LINQ,并且你将在每个编译问题上得到与CodeDom相同的程序集。我将此标记为答案,谢谢。我正在与第3点作斗争——实际运行查询并返回IQueryable。如果这不起作用,我就回到第四点。这也花了整整一天的时间。但从那以后,它一直运作良好。这是我们当前的生产实现(已经完成了4个,然后是2个,然后是1个)。