在使用LinqPad时我有一个Select x, Extra=f(y)
查询,我希望将x
的所有属性(和字段)返回到与Extra
相同的级别,而不是x
而不是单独的Extra
和Select x.p1, x.p2, Extra=f(y)
属性(或字段)。
可以这样做吗?
即。我想要x
而不必输入那么多。
请注意new {}
的类型实际上可能是也可能不是匿名的,只是有些不透明或者太大而无法手动复制。 VB.NET隐式类型和C#显式{{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
查询。