将匿名类型传递为T

joc*_*ull 5 c# entity-framework anonymous-types

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

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();
Run Code Online (Sandbox Code Playgroud)

问题是,对我来说,这感觉很麻烦.我必须为一个查询创建这个类,我永远不会再用它来做任何其他事情.结果使用的位置与执行位置相差一行.

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

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

var q = dbcontext.Database.SqlQuery<anonItem.GetType()>("...");
Run Code Online (Sandbox Code Playgroud)

我只是无法弄清楚如何在我的匿名类型的传递TypeT.可能吗?

Tim*_* S. 5

如果您进行设置,则可以执行此操作,以便可以推断出类型.例如

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

我认为这有点hackish,我建议尝试另一种方法,比如实际创建命名类或使用元组.

  • 我认为元组是不行的.``结果类型'System.Tuple`4 [System.Double,System.Double,System.Double,System.Double]'可能不是抽象的,必须包含默认构造函数.` (2认同)

Jim*_* G. 2

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

我不认为这是一个问题。

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

您可以创建一个组。

  • @jocull:我通常只是将它们创建为私有内部类,以限制可访问性并传达有意限制的适用性。// 根据您的编码风格,您可以在使用它们的方法附近、文件末尾声明它们,甚至可以在它们自己的 #region 内将它们组合在一起。 (2认同)