将字符串解析为LINQ查询

问题描述 投票:10回答:6

将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>

c# .net linq iqueryable linq-query-syntax
6个回答
4
投票

它需要一些文本解析和大量使用System.Linq.Expressions。我用这个herehere做了一些玩弄。第二篇文章中的代码从第一篇文章稍微更新,但仍然是粗略的。我偶尔会继续乱用这个版本并且有一个更清洁的版本,如果你有任何兴趣,我一直想发布。我已经非常接近支持ANSI SQL 89的一个很好的子集了。


4
投票

从.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) {
//
}

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


2
投票

这可能适合你:C# eval equivalent?


2
投票

您将需要一个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


1
投票

这可能会或可能不会帮助你,但请查看LINQ Dynamic Query Library


0
投票

虽然这并没有特别给出一个回答你的问题的例子,但我认为最好的做法通常是从字符串构建一个表达式树。

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

请参阅Microsoft撰写的这篇文章。

那里可能还有其他更好的帖子。此外,我认为像RavenDB这样的东西已经在它的代码库中用于定义索引。

© www.soinside.com 2019 - 2024. All rights reserved.