如何在运行时从文本构建LINQ查询?

时间:2010-04-18 08:15:32

标签: c# linq

我有一个

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}");

关键是,用户(具有编程技能)可以动态自由地选择显示的数据。

5 个答案:

答案 0 :(得分:5)

Dynamic Linq宝贝!

R.E。评价。

是的,使用Dynamic Linq可能无法编写示例,但如果您将常量分解出去,例如'来自数据'你留下'where'和'select',可以用动态linq表示。

所以两个文本框,如果包含orderby,可能是三个,可能满足您的要求。

只是一个想法。

Jon有一个有趣的方法,但我会对编译和执行无限制的代码持怀疑态度。

答案 1 :(得分:4)

好吧,你可以使用CSharpCodeProvider在执行时编译代码。请查看Snippy以获取此示例。在这种情况下,您需要在接受名为List<A>的{​​{1}}的方法中编译用户代码。我的经验是它有效,但要做到这一点可能会略显繁琐 - 尤其是在添加适当的参考资料等方面。

答案 2 :(得分:1)

很晚才回答;但是,它会帮助访问此页面的人。

我有类似的要求,我通过动态编译字符串LINQ查询,在内存中收集并收集结果来解决它。只有catch是用户输入需要有效的C#可编译代码,否则它返回异常消息而不是结果。

代码很长,所以这里是github link

github上的示例应用程序显示了多个示例,包括投影。

答案 3 :(得分:0)

虽然可能有一些方法可以做到这一点,但LINQ并不是为这种情况设计的。使用CodeDOM(如Jon建议的那样)可能是轻松完成任务的唯一方法。如果您信任用户并且他/她具有编程技能,您可能只是使用旧式方法并让用户使用SQL输入查询?

另一方面,如果您选择创建一些构建查询的可视化工具,则不需要通过组合字符串来构建它们,而是可以组合表达式树。例如,使用Linq KitAsExpandable

答案 4 :(得分:0)