12

将 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>在本地范围内。

4

6 回答 6

7

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

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

于 2016-07-20T10:53:23.883 回答
5

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

于 2011-03-23T02:35:04.130 回答
3

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

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

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

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

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

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

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

于 2011-03-23T02:53:47.660 回答
2

这可能对您有帮助,也可能无济于事,但请查看LINQ 动态查询库

于 2011-03-23T03:02:23.903 回答
2

这可能对您有用:C# eval 等价物?

于 2011-03-23T01:57:22.147 回答
0

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

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

请参阅Microsoft的这篇文章。

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

于 2011-03-23T02:32:07.850 回答