将匿名类型作为T传递

5
在 Entity Framework 中,您可以像这样实时运行和绑定自定义查询...
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 可以做到,但这样做有点糊弄。至于是否有更好的方法,我不确定。 - Servy
@Matthew,回答发布的内容甚至是我自己正在考虑发布的。现在我们俩都吓坏了。 - Servy
2个回答

5

如果您设置类型可以被推断,便可实现此操作。例如:

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

我认为这种方法有点笨拙,建议尝试其他方法,比如实际创建命名类或使用元组。


我同意你的想法... 强制编译器处理这个问题的方法确实有些不太自然。 - jocull
2
我认为元组不可行。 "结果类型 'System.Tuple`4[System.Double,System.Double,System.Double,System.Double]' 不能是抽象的,必须包括默认构造函数。" - jocull
你在使用匿名类型推断时也会遇到类似的错误... "结果类型 '<>f__AnonymousType7`4[System.Double,System.Double,System.Double,System.Double]' 不能是抽象的,必须包含默认构造函数。" 有什么关于这些一次性代理类应该存储在哪里的最佳实践建议吗?我不喜欢它们无处可放。 - jocull

2
问题在于,对我来说,这感觉很混乱。我必须为一个查询创建这个类,我再也不会再用它做其他事情了。结果正好在执行它的下一行使用。
我不认为这是一个问题。
你可以创建一个元组来代替返回匿名类型。

有没有关于这些一次性代理类应该存储在哪里的最佳实践建议?我讨厌它们只是悬挂在那里。 - jocull
2
@jocull:我通常会将它们创建为私有内部类,以限制访问性并传达其有意的受限适用性。//根据您的编码风格,您可以在使用它们的方法附近声明它们,放在文件末尾,甚至在它们自己的#region中组合在一起。 - Jim G.
元组不起作用!我一开始使用元组,很快发现{"结果类型 'System.Tuple`2[System.Int32,System.String]' 可能不是抽象的,并且必须包括默认构造函数。"} 使用具体类似乎是使其正常工作的可靠方法。 - joedotnot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接