获取Linq To Objects查询的字符串表示形式

时间:2013-12-16 14:07:29

标签: c# linq debugging expression-trees

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

之类的东西
Bananas
  ->Where color='blue'
  ->Where size>'20cm'
  ->Take 25

确实是表达式树的表示。

有可能吗?怎么样?

3 个答案:

答案 0 :(得分:2)

你可以这样做,但你必须编写自己的表达式树访问者(一个派生自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/

答案 1 :(得分:1)

只需在查询上调用ToString即可。显然,您需要使用IQueryable扩展方法将字符串构建为AsQueryable,而不是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 []。其中(n =>((n%2)== 0))。Take(25)

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

答案 2 :(得分:0)

从罗伊的回答开始,有一个代码复合项目可以解决同样的问题,但是alos显示整个表达式树,以及用简单的英语生成的最终linq表达式:

http://exprtreevisualizer.codeplex.com/

这实际上看起来像一个不错的小工具,我必须承认,我没有尝试过vs2012但是已经注意并在vs2010中看了一下。我不确定是否已经为vs2012创建了扩展版本,但这肯定与你提到的非常相似。