Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Linq_Iqueryable_Linq Query Syntax - Fatal编程技术网

C# 将字符串解析为LINQ查询

C# 将字符串解析为LINQ查询,c#,.net,linq,iqueryable,linq-query-syntax,C#,.net,Linq,Iqueryable,Linq Query Syntax,将LINQ字符串解析为查询的最佳实践是什么 或者换句话说,哪种方法最适合转换: string query = @"from element in source where element.Property = ""param"" select element"; 进入 假设源引用本地作用域中的IEnumerable或IQueryable。这可能对您有用:虽然这并没有具体给出一个示例来回答您的问题,但我认为最佳实践通常是从

将LINQ字符串解析为查询的最佳实践是什么

或者换句话说,哪种方法最适合转换:

 string query = @"from element in source
                  where element.Property = ""param""
                  select element";
进入


假设源引用本地作用域中的IEnumerable或IQueryable。

这可能对您有用:

虽然这并没有具体给出一个示例来回答您的问题,但我认为最佳实践通常是从字符串构建表达式树

在这个问题中,我问了如何使用显示构建表达式树的一部分的字符串过滤linq查询。但是,这个概念可以扩展为构建一个完整的表达式树来表示字符串

请参阅第页的这篇文章


可能还有其他更好的帖子。此外,我认为在定义索引的代码库中已经有类似的功能了。

它需要一些文本解析和大量使用。我玩过这个,还有。第二篇文章中的代码在某种程度上比第一篇文章有所更新,但仍然有些粗糙。有时我会继续搞砸这件事,如果你有兴趣的话,我一直想发布一个更干净的版本。我已经非常接近于支持ANSI SQL 89的一个很好的子集了。

根据您希望在LINQ中支持的C语言功能,您至少需要一个C语言解析器v3.5,可能是v4.0。您将获取这些解析器结果,并使用访问者模式将其直接馈送到表达式树中。我还不确定,但我敢打赌您还需要某种形式的类型分析来完全生成表达式节点

我正在寻找和你一样的东西,但我真的没有那么迫切地需要它,所以我没有努力搜索,也没有按照这些思路编写任何代码

我已经编写了一些东西,它接受用户字符串输入,并使用Microsoft.CSharp.CSharpCodeProvider编译器提供程序类将其编译为动态程序集。如果您只想获取代码字符串并执行结果,这应该很适合您

以下是我编写的控制台工具LinqFilter的描述:

这是源存储库。LinqFilter/Program.cs演示如何使用编译器编译LINQ表达式:


这可能对您有帮助,也可能没有帮助,但请检查。

从.NET 4.6开始,您可以使用CSharpScript解析Linq。假设要分析的表达式位于字符串变量查询中,则可以执行以下操作:

string query = "from element in source where element.Property = ""param"" select element";
IEnumerable result = null;
try 
{
    var scriptOptions = ScriptOptions.Default.WithReferences(typeof(System.Linq.Enumerable).Assembly).WithImports("System.Linq");
    result = await CSharpScript.EvaluateAsync<IEnumerable>(
             query,
             scriptOptions,
             globals: global);
} catch (CompilationErrorException ex) {
//
}

不要忘记传递您想要处理的数据源,全局变量可以在脚本解析中访问它们。

不幸的是,这将很困难。我希望有人能让我大吃一惊,证明我错了,但我不希望发生这种事。这并不能完全回答你的问题,但听起来很像www.linqpad.net会做的。。。但是我不知道他们是怎么做到的。一个想法出现了:如果你偏执于字符串必须是一个表达式,那么你可以使用CSharpCodeProvider并按照这里的expression query=LINQ code生成代码;然后编译器将为您构建表达式树。这只是一个编译调用的问题,返回一个委托来执行它,并进行一些反射来找到您生成的动态程序集的方法,以便您可以执行它。希望这是有意义的;我在这里有点漫无边际哈哈:原谅我,它需要一个或多个表达。在生成的代码中,可以按如下方式安全地连接:表达式getQuery==>linqqueryhere;编译器将只接受可以解析为表达式树的有效表达式。对于C v3.5,这不包括语句和赋值表达式。这里的两个括号对不是错误。你调用Compile方法返回一个委托,然后调用该委托返回你的IQueryable或任何你期望返回的IQueryable/IEnumerable类型。在.NET Core中有什么方法可以做到这一点吗?我怀疑这会有那么简单。猜测所需的CSharpScript和Linq不是.NETCore的一部分。投票表决还是不错的。
string query = "from element in source where element.Property = ""param"" select element";
IEnumerable result = null;
try 
{
    var scriptOptions = ScriptOptions.Default.WithReferences(typeof(System.Linq.Enumerable).Assembly).WithImports("System.Linq");
    result = await CSharpScript.EvaluateAsync<IEnumerable>(
             query,
             scriptOptions,
             globals: global);
} catch (CompilationErrorException ex) {
//
}