【问题标题】:Get string representation of a Linq To Objects Query获取 Linq To Objects 查询的字符串表示形式
【发布时间】:2013-12-17 01:15:15
【问题描述】:

在 Web 应用程序中,我有 linq To Object 查询来进行数据提取/合并。 为了便于调试,我想直接在生成的 HTML 中显示 linq 查询结构;像

Bananas
  ->Where color='blue'
  ->Where size>'20cm'
  ->Take 25

确实是表达式树的表示。

有可能吗?怎么样?

【问题讨论】:

标签: c# linq debugging expression-trees


【解决方案1】:

您可以这样做,但您必须编写自己的表达式树访问器(派生自 ExpressionVisitor 的类)。也就是说,您必须编写代码来遍历作为您的 LINQ 查询的表达式树并构建您想要的字符串。

有关表达式树访问者的更多信息,请参阅http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx

实际上,网络上有一个非常有趣的例子已经完成了大部分工作:http://pelebyte.net/blog/2011/05/13/doing-simple-things-with-expressionvisitor/

【讨论】:

    【解决方案2】:

    只需在查询中调用ToString。显然,您需要使用AsQueryable 扩展方法将字符串构建为IQueryable,而不是IEnumerable

    这个例子:

    var list = new int[] { 1, 2, 3, 4, 5 };
    
    var query = list.AsQueryable()
        .Where(n => n % 2 == 0)
        .Take(25);
    
    string querystring = query.ToString();
    

    产生这个字符串:

    System.Int32[].Where(n => ((n % 2) == 0)).Take(25)

    如果您有自己的特定格式很重要,而不是使用这种默认格式,那么you can handle it on your own,但这会打开一大堆蠕虫;如果您想这样做,请确保您确实需要它。

    【讨论】:

    • Roy 提供的解决方案可以满足我的需要,但这个似乎要简单得多!谢谢
    【解决方案3】:

    从 Roy 的回答开始,实际上有一个 codeplex 项目可以解决相同的问题,但 alos 显示了整个表达式树,以及用简单的英语生成的最终 linq 表达式:

    http://exprtreevisualizer.codeplex.com/

    这实际上看起来是一个不错的小工具,但我必须承认,我没有在 vs2012 中尝试过,但在 vs2010 中已经意识到并查看过。我不确定是否创建了 vs2012 的扩展版本,但这肯定与您提到的差不多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多