获取Linq-To对象查询的字符串表示形式



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

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

事实上,表达树的一种表示。

有可能吗?怎样

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

只需在查询中调用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[]。其中(n=>((n%2)==0)).Take(25)

如果重要的是你有自己的特定格式,而不是使用这种默认格式,那么你可以自己处理,但这会打开一个很大的漏洞;如果你想这样做的话,一定要确保你真的需要它。

根据Roy的回答,实际上有一个codeplex项目可以解决同样的问题,但alos显示了整个表达式树,以及最终的linq表达式(简体中文):

http://exprtreevisualizer.codeplex.com/

这实际上看起来是一个很好的小工具,尽管我不得不承认,我在vs2012中没有尝试过,但在vs2010中已经意识到并看到了。我不确定是否已经为vs2012创建了扩展版本,但这确实做到了你提到的。

最新更新