将字符串解析为LINQ查询

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

换句话说,什么方法最有意义转换:

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

  IEnumerable = from element in source where element.Property = "param" select element; 

假设source引用本地范围中的IEnumerableIQueryable

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

这可能适合您: C#eval等效?

您将需要一个C#语言解析器(至少v3.5,可能是v4.0,具体取决于您希望在LINQ中支持哪些C#语言function)。 您将获取这些解析器结果并使用访问者模式将其直接提供给Expression树。 我不确定但是我愿意打赌你还需要某种forms的类型分析来完全生成Expression节点。

我正在寻找与你相同的东西,但我并不是真的非常需要它,所以我没有努力搜索,也没有沿着这些方向编写任何代码。

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

这是我写的控制台工具LinqFilter的描述:

http://bittwiddlers.org/?p=141

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

http://bittwiddlers.org/viewsvn/trunk/public/LinqFilter/?root=WellDunne

从.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( query, scriptOptions, globals: global); } catch (CompilationErrorException ex) { // } 

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

这可能对您有所帮助,但可以查看LINQ动态查询库 。

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

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

请参阅Microsoft的这篇文章。

那里可能还有其他更好的post。 另外我觉得像RavenDB这样的东西已经在它的代码库中用于定义索引。