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

11

我有一个

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个回答

6

动态Linq宝贝!

r.e.评论。

是的,按照书面方式编写的示例可能无法使用Dynamic Linq,但如果将常量分解出来,例如“from a in data”,则会留下一个“where”和一个“select”,可以用动态linq表达。

因此,两个文本框,如果包括orderby,则可能满足您的要求。

只是一种想法。

Jon有一种有趣的方法,但我不敢编译和执行不受限制的代码。


我不认为使用动态 Linq 可以实现这个。 - Danvil
@Danvil - 你说得对,按照你写的例子可能行不通,但是当你把常量因素分离出来,比如...啊,算了,我就直接编辑答案吧。 - Sky Sanders

4

嗯,你可以使用CSharpCodeProvider在执行时编译代码。可以参考Snippy的示例。在这种情况下,您需要编译一个接受名为dataList<A>的方法。我的经验是它可以工作,但可能需要花费一些时间来正确添加适当的引用等。


4
+1 但是会担心编译和执行任意代码。这需要尽职调查,而且做过这样的事情后,我可以说这并不好玩,会在你的梦中萦绕。;-) - Sky Sanders

1

虽然回答比较晚,但它将有助于访问此页面的某些人。

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

代码非常长,因此这里是github链接

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


0

虽然可能有一些方法可以做到这一点,但是LINQ并不是为这种情况而设计的。使用CodeDOM(如Jon所建议的)可能是轻松完成此操作的唯一方法。如果您信任用户并且他/她具有编程技能,您可以尝试使用传统的方法,让用户使用SQL输入查询语句?

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


我有一个类的数据,而不是数据库。我认为通过使用LINQ,我可以在类上实现类似于SQL查询在数据库上所能做到的交互式查询行为。 - Danvil


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接