代码之家  ›  专栏  ›  技术社区  ›  Danvil

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

  •  10
  • Danvil  · 技术社区  · 14 年前

    我有一个

    class A {
       public int X;
       public double Y;
       public string Z;
       // and more fields/properties ...
    };
    

    和A List<A> data 并且可以像e.g.

    var q = from a in data where a.X > 20 select new {a.Y, a.Z};
    

    然后 dataGridView1.DataSource = q.ToList(); 在“我的数据网格视图”中显示所选内容。

    现在的问题是,是否可以从用户在运行时输入的文本构建查询?喜欢

    var q = QueryFromText("from a in data where a.X > 20 select new {a.Y, a.Z}");
    

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

    5 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    好吧,你可以用 CSharpCodeProvider 在执行时编译代码。看一看 Snippy 举个例子。在这种情况下,您需要在接受 List<A> 打电话 data . 我的经验是,它是有效的,但它可能会有点微妙的权利-特别是在添加适当的参考资料等方面。

        2
  •  5
  •   Sky Sanders    14 年前

    Dynamic Linq 宝贝!

    R.E.评论。

    是的,使用dynamic linq编写的示例可能是不可能的,但是如果您将常量(例如“from a in data”)去掉,则会留下一个“where”和一个可以用dynamic linq表示的“select”。

    因此,两个文本框(如果包含orderby,可能有三个)可能满足您的需求。

    只是一个想法。

    jon有一个有趣的方法,但是我对编译和执行不受限制的代码持谨慎态度。

        3
  •  1
  •   Amit    9 年前

    回答得很晚;不过,这对访问此页的人有帮助。

    我有类似的需求,我通过动态编译字符串 LINQ 查询,在内存收集中执行它并收集结果。唯一的捕获是用户输入必须是有效的可编译代码,否则将返回异常消息而不是结果。

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

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

        4
  •  0
  •   Tomas Petricek    14 年前

    尽管可能有一些方法可以做到这一点,但linq并不是为这个场景而设计的。使用codedom(正如jon建议的那样)可能是实现这一点的唯一方法。如果您信任用户并且他/她有编程技能,那么您可以使用老式方法,让用户使用sql输入查询?

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

        5
  •  0
  •   Mustafa Magdy    13 年前