【问题标题】:Extend an existing (anonymous) type in a select query在选择查询中扩展现有(匿名)类型
【发布时间】:2015-03-09 07:44:08
【问题描述】:

在使用 LinqPad 时,我有一个 Select x, Extra=f(y) 查询,我想返回与 Extra 相同级别的 x 的所有属性(和字段),而不是单独的 x 和 @ 987654325@ 属性(或字段)。

这个可以吗?

即我想要Select x.p1, x.p2, Extra=f(y) 而不必输入那么多。

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

【问题讨论】:

  • 即使您的回答对它有所启发,这个问题也不是很清楚。所以一个新的匿名类型兼具这两种类型的属性是不够的? select new { x, y }
  • @TimSchmelter 这是我的 VB.NET 示例的 c# 版本(如果您的意思是 f(y),而不仅仅是 y)。但是,是的,我停下来喝茶。我应该添加我想要的示例。

标签: .net select anonymous-class


【解决方案1】:

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 查询中。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多