将字符串解析为LINQ查询

时间:2011-03-23 01:45:52

标签: c# .net linq iqueryable linq-query-syntax

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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 :(得分:2)

这可能对您有用:C# eval equivalent?

答案 3 :(得分: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

答案 4 :(得分:1)

这可能对您有所帮助,但可以查看LINQ Dynamic Query Library

答案 5 :(得分:0)

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

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

请参阅Microsoft中的这篇文章。

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