将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>
。
答案 0 :(得分:4)
它需要一些文本解析和大量使用System.Linq.Expressions。我已经对这个here和here进行了一些玩弄。第二篇文章中的代码从第一篇文章稍微更新,但仍然是粗略的。我偶尔会继续乱用这个版本并且有一个更清洁的版本,如果你有任何兴趣,我一直想发布。我已经非常接近支持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)