<分区>
更新:问题仍然存在于我的现实世界解决方案中 - 但不在 LinqPad 中。我知道你不能复制它。我也不行。只要我有一些空闲时间,我就会剥离现实世界的解决方案以便能够分享它。
考虑这个简单的类
public class Node
{
public string Group { get; set; }
public int SequenceNumber { get; set; }
public override string ToString()
{
return string.Format("This is the Node.ToString() method!");
}
}
我有两个 linq 查询。它们都返回完全相同的结果,不同之处在于先前排序的列表中后面的查询组。
// working example
var query = unsortedNodes.GroupBy(n => n.Group).SelectMany(g => g.OrderBy(n => n.SequenceNumber));
_nodes = query.ToList();
_nodes.ForEach(n => LoggerProxy.Debug(_logger, null, "Node {0}", n));
示例结果:
2015-12-21 15:29:00.9083 DEBUG Company.Project.Controls.MyControl Node "This is the Node.ToString() method!"
好!
但是,如果我向 linq 查询添加另一个“orderby”,因为我还希望对分组进行排序,ToString() 方法突然不再起作用。
// query working, but ToString() in logger method is not.
// sort by group, group by group, sort by sequence number
var query = unsortedNodes.OrderBy(n => n.Group).GroupBy(n => n.Group).SelectMany(g => g.OrderBy(n => n.SequenceNumber));
_nodes = query.ToList();
_nodes.ForEach(n => LoggerProxy.Debug(_logger, null, "Node {0}", n));
令我惊讶的是,日志现在只显示类名(默认 ToString() 行为)。
示例结果:
2015-12-21 15:25:00.0137 DEBUG Company.Project.Controls.MyControl Node "Company.Project.Node"
不好!
这与记录器无关。 Visual Studio 中间窗口:
_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"
.NET 框架版本为 4.5.51209(发布 379893)
通过在 linq 查询中添加和删除“.OrderBy(n => n.Group)”语句,可以通过两种方式重现该问题。
有什么线索吗?