C# 将字符串解析为LINQ查询
将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。这可能对您有用:虽然这并没有具体给出一个示例来回答您的问题,但我认为最佳实践通常是从
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) {
//
}