[英]How to build a LINQ query from text at runtime?
我有一个
class A {
public int X;
public double Y;
public string Z;
// and more fields/properties ...
};
和List<A> data
,可以构建一个linq查询,例如
var q = from a in data where a.X > 20 select new {a.Y, a.Z};
然后dataGridView1.DataSource = q.ToList();
在我的DataGridView中显示选择。
现在的问题是,是否可以从用户在运行时输入的文本构建查询? 喜欢
var q = QueryFromText("from a in data where a.X > 20 select new {a.Y, a.Z}");
关键是,用户(具有编程技能)可以动态且自由地选择显示的数据。
动态Linq宝贝!
评论。
是的,使用Dynamic Linq可能无法编写示例,但如果您将常量分解出来,例如'from a in data',您将留下'where'和'select',它们可以用动态linq表示。
所以两个文本框,如果包含orderby,可能是三个,可能满足您的要求。
只是一个想法。
Jon有一个有趣的方法,但我会对编译和执行无限制代码持谨慎态度。
好吧,您可以使用CSharpCodeProvider
在执行时编译代码。 看看Snippy就是一个例子。 在这种情况下,你需要编译的用户代码中接受的方法List<A>
称为data
。 我的经验是它有效,但为了做到这一点可能会略显繁琐 - 特别是在添加适当的参考文献等方面。
很晚才回答它; 但是,它会帮助访问此页面的人。
我有类似的要求,我通过动态编译字符串作为LINQ
查询,通过内存中的集合执行它并收集结果来解决它。 只有catch是用户输入需要有效的C#可编译代码,否则它返回异常消息而不是结果。
代码很长,所以这里是github链接
github上的示例应用程序显示了多个示例,包括投影。
虽然可能有一些方法可以做到这一点,但LINQ并不是为这种情况设计的。 使用CodeDOM(如Jon建议的那样)可能是轻松完成任务的唯一方法。 如果您信任用户并且他/她具有编程技能,您可能只是使用旧式方法并让用户使用SQL输入查询?
另一方面,如果您选择创建一些用于构造查询的可视化工具,则无需通过组合字符串来构建它们,而是可以组合表达式树。 例如,使用Linq Kit和AsExpandable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.