在选择查询中扩展现有(匿名)类型

时间:2015-03-09 07:44:09

标签: .net select anonymous-class

在使用LinqPad时我有一个Select x, Extra=f(y)查询,我希望将x的所有属性(和字段)返回到与Extra相同的级别,而不是x而不是单独的ExtraSelect x.p1, x.p2, Extra=f(y)属性(或字段)。

可以这样做吗?

即。我想要x而不必输入那么多。

请注意new {}的类型实际上可能是也可能不是匿名的,只是有些不透明或者太大而无法手动复制。 VB.NET隐式类型和C#显式{{1}}产生的类型是匿名的。

1 个答案:

答案 0 :(得分:0)

Jon Skeet已经消极地回答了这个问题here(但这个问题不重复,因为它是一个特例)。

此处的解决方法是My Extensions至少列出准备好粘贴回Select查询的属性和字段。

// Properties so you can "extend" anonymous types
public static string AllProperties<T>(this T obj, string VarName)
{
    var ps=typeof(T).GetProperties();
    return ps.Any()?(VarName + "." + string.Join(", " + VarName + ".", from p in ps select p.Name)):"";
}

// Fields so you can "extend" anonymous types
public static string AllFields<T>(this T obj, string VarName)
{
    var fs=typeof(T).GetFields();
    return fs.Any()?(VarName + "." + string.Join(", " + VarName + ".", from f in fs select f.Name)):"";
}

你可能很幸运能够说出Select x.AllProperties("x") Take 1但是当你需要避免使用Linq-to-SQL时,你需要添加更多:(from ... Select x).First().AllProperties("x"),甚至更多的箍如果你需要获得属性和字段(正如我发现你使用LinqPad生成的实体)。

这些会生成一个类似"x.p1, x.p2"的字符串,可以粘贴回原始Select查询。