LINQPad:如何向转储的每一行添加属性?

Uni*_*onP 5 c# linqpad

在 LINQPad 中,我经常想要转储一些 SQL 表,但为每一行添加一个属性。我通常默认简单的:

Publishers
.Select(p => new { p, AppCount = p.Apps.Count() })
Run Code Online (Sandbox Code Playgroud)

但是,这当然会导致输出混乱,因为每个项目都被格式化为垂直表,并有一个额外的列包含添加的属性。我可以创建一个新对象,但这非常冗长,并且您会丢失表遍历链接:

Publishers
.Select(p => new { p.PublisherId, p.Name, p.Added, ..., AppCount = p.Apps.Count() })
Run Code Online (Sandbox Code Playgroud)

我想要的是某种合并语法,它创建一个动态对象以使用添加的属性进行转储:

Publishers
.Select(p => p.Merge(new { AppCount = p.Apps.Count() })
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的方法来实现这一点:使用 JsonConvert.SerializeObject (这在尝试序列化所有外键引用和重复循环时变得混乱,使用 ExpandoObject (无法想出一个漂亮的干净语法),以及类似的库https://github.com/kfinley/TypeMerger,我也还没有开始工作。

有没有人想出一个干净的方法来做到这一点?LINQPad 是否有一些内置的语法可供我使用?谢谢!

更新:我上传了一个示例脚本来演示该问题,并让任何人尝试他们的解决方案:http://share.linqpad.net/kclxpl.linq

要运行,您需要填充 Nutshell 数据库,您可以使用 LINQPad 中的“填充演示数据库”示例来完成此操作。

Joe*_*ari 6

这是一个很难解决的问题。部分问题在于,当将延迟加载的属性从其“实体”主目录中取出并移动到 ExpandoObject 时,允许 LINQPad 识别延迟加载的属性的元数据会丢失,从而导致过多的往返。

为了避免这种痛苦,我在LINQPad 7.2.7Util.Merge中添加了一个方法。这是它最简单的用法:

var o1 = new { A = 1, B = 2 };
var o2 = new { C = 3, D = 4 };

Util.Merge (o1, o2).Dump();
Run Code Online (Sandbox Code Playgroud)

对于手头的问题:

Publishers
   .Select(p => Util.Merge (p, new { AppCount = p.Apps.Count() }))
Run Code Online (Sandbox Code Playgroud)