【问题标题】:Passing an anonymous type as T将匿名类型作为 T 传递
【发布时间】:2012-09-06 04:51:01
【问题描述】:

在实体框架中,您可以像这样即时运行和绑定自定义查询...

protected class NitrogenMoisutreContainer
{
    public double MinN { get; set; }
    public double MaxN { get; set; }
    public double MinM { get; set; }
    public double MaxM { get; set; }
}

// ...

var q = dbcontext.Database.SqlQuery<NitrogenMoisutreContainer>(@"SELECT MAX(NitrogenBalance) as MaxN, MIN(NitrogenBalance) as MinN, MAX(FCWaterPercent) as MaxM, MIN(FCWaterPercent) as MinM
                                                                    FROM agZoneProjectionGrowthStages
                                                                    WHERE NitrogenBalance > 0 AND FCWaterPercent > 0").First();

问题是,对我来说,这感觉很混乱。我必须为一个查询创建这个类,我永远不会再将它用于其他任何事情。结果在执行位置的下一行使用。

有没有办法可以返回匿名类型?即使我必须先声明它,像这样......

var anonItem = new {
    MinN = 0d,
    MaxN = 0d,
    MinM = 0d,
    MaxM = 0d
};

var q = dbcontext.Database.SqlQuery<anonItem.GetType()>("...");

我只是不知道如何将我的匿名类型的Type 传递为T。有可能吗?

【问题讨论】:

  • 我认为这是不可能的,因为泛型是在编译时确定的。
  • @Matthew 这是可能的,虽然它很老套。至于有没有好的方法,我不知道。
  • @Matthew 而发布的答案甚至是我自己争论的答案。现在我们都吓坏了。

标签: c# entity-framework anonymous-types


【解决方案1】:

如果您设置它以便可以推断类型,则可以做到这一点。例如

public static IEnumerable<T> GetObjects<T>(T exampleItem, string sqlQuery) { ... }
var q = GetObjects(anonItem, @"");

我认为这有点骇人听闻,我建议尝试另一种方法,例如实际创建命名类或使用元组。

【讨论】:

  • 我同意你的观点......拥有强制编译器处理它的方法确实有点骇人听闻。
  • 我认为元组是不行的。 The result type 'System.Tuple`4[System.Double,System.Double,System.Double,System.Double]' may not be abstract and must include a default constructor.
  • 您实际上也会通​​过推理得到类似的 anon 类型错误...The result type '&lt;&gt;f__AnonymousType7`4[System.Double,System.Double,System.Double,System.Double]' may not be abstract and must include a default constructor. 关于这些一次性代理类应该存储在哪里的最佳实践有什么建议吗?我讨厌让他们晃来晃去。
【解决方案2】:

问题是,对我来说,这感觉很混乱。我必须为一个查询创建这个类,并且我永远不会再将它用于其他任何事情。结果在执行位置的下一行使用。

我不认为这是一个问题。

有没有办法可以返回匿名类型?

您可以改为创建tuple

【讨论】:

  • 关于这些一次性代理类的存储位置的最佳实践有什么建议吗?我讨厌让他们晃来晃去。
  • @jocull:我通常只是将它们创建为私有内部类,以限制可访问性并传达有意限制的适用性。 // 根据您的编码风格,您可以在使用它们的方法附近、文件末尾声明它们,甚至可以在它们自己的#region 中组合在一起。
  • 元组不起作用!我从元组开始,很快发现{“结果类型'System.Tuple`2[System.Int32,System.String]'可能不是抽象的,必须包含默认构造函数。”}。使用具体类似乎是使其工作的行之有效的方法。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2021-06-23
相关资源
最近更新 更多