将字符串解析为LINQ查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字符串解析为LINQ查询相关的知识,希望对你有一定的参考价值。
将LINQ字符串解析为查询的最佳实践方法是什么?
换句话说,转换最有意义的方法是:
string query = @"from element in source
where element.Property = ""param""
select element";
成
IEnumerable<Element> = from element in source
where element.Property = "param"
select element;
假设source
指的是当地范围内的IEnumerable<Element>
或IQueryable<Element>
。
它需要一些文本解析和大量使用System.Linq.Expressions。我用这个here和here做了一些玩弄。第二篇文章中的代码从第一篇文章稍微更新,但仍然是粗略的。我偶尔会继续乱用这个版本并且有一个更清洁的版本,如果你有任何兴趣,我一直想发布。我已经非常接近支持ANSI SQL 89的一个很好的子集了。
从.NET 4.6开始,您可以使用CSharpScript来解析Linq。假设您要解析的表达式是字符串变量“query”,这将执行此操作:
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) {
//
}
不要忘记传递您想要处理的(数据)源,使用全局变量在脚本解析中访问它们。
这可能适合你:C# eval equivalent?
您将需要一个C#语言解析器(至少v3.5,可能是v4.0,具体取决于您希望在LINQ中支持的C#语言功能)。您将获取这些解析器结果,并使用访问者模式将其直接提供给表达式树。我不确定但是我愿意打赌你还需要某种形式的类型分析来完全生成Expression节点。
我正在寻找与你相同的东西,但我并不是真的非常需要它,所以我没有努力搜索,也没有按照这些方式编写任何代码。
我编写了一些内容,它接受用户字符串输入并使用Microsoft.CSharp.CSharpCodeProvider
编译器提供程序类将其编译为动态程序集。如果你只想获取代码串并执行结果,这应该适合你。
这是我写的控制台工具LinqFilter的描述:
http://bittwiddlers.org/?p=141
这是源存储库。 LinqFilter / Program.cs演示了如何使用编译器编译LINQ表达式:
http://bittwiddlers.org/viewsvn/trunk/public/LinqFilter/?root=WellDunne
这可能会或可能不会帮助你,但请查看LINQ Dynamic Query Library。
虽然这并没有特别给出一个回答你的问题的例子,但我认为最好的做法通常是从字符串构建一个表达式树。
在this问题中,我询问如何使用字符串过滤linq查询,该字符串显示构建表达式树的一部分。但是,这个概念可以扩展为构建表示字符串的整个表达式树。
请参阅Microsoft撰写的这篇文章。
那里可能还有其他更好的帖子。此外,我认为像RavenDB这样的东西已经在它的代码库中用于定义索引。
以上是关于将字符串解析为LINQ查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 Entity Framework Core 在 LINQ 查询中将字符串转换为 DateTime