由于实例化值为 null,导致将类型转换为 'Int32' 的操作失败。

5

我在我的ASP.NET MVC Web应用程序中有以下代码:

SystemInformation s = new SystemInformation()
            {
AssetCount = new AssetCount() {

                CustomerCount = entities.AccountDefinitions == null ? 0 : entities.AccountDefinitions.Count(),
                RackCount = tms.TMSRacks == null ? 0 : tms.TMSRacks.Count(),
                ServerCount = tms.TMSServers == null ? 0 : tms.TMSServers.Count(),
                CustomCount = tms.CustomAssets==null? 0 : tms.CustomAssets.Sum(a => a.Quantity)

            },

但是目前如果任何一个Enumerable为空,我将会得到以下错误:

转换为值类型 'Int32' 失败,因为实例化的值为 null。结果类型的泛型参数或查询必须使用可空类型。


这是因为int32是一种原始类型而不是对象,因此不可为空。 尝试使用此主题中建议的方法。 简而言之:在声明RackCount(例如)时,可以使用以下语法之一:int32? RackCount;Nullable<int32> RackCount; - Irwene
1
你首先不应该让这些集合中的任何一个为空。根本不需要进行这些检查。请记住,对于集合来说,“null”和“empty”是两个非常不同的概念。 - Servy
@Grant 是的,我有点累了,发帖后看到了这个问题。 我不知道 Sum 方法的行为。它可能是由于返回 null 的错误引起的吗? - Irwene
1
@Sidewinder94 当尝试对空集合求和时,您会收到此错误提示;在对值进行求和之前,您需要确保它是非空的。 - Servy
所以问题出在求和上? - John John
1个回答

8
问题可能是 tms.CustomAssets 集合为空。 为了解决这个问题,可以尝试编写类似以下的代码:
var tmpCustomCount = tms.CustomAssets.Sum(a => (int?)a.Quantity);

...
AssetCount = new AssetCount() 
{
...
   CustomCount = tmpCustomCount ?? 0
}

我无法引用单词“let”。 - John John
1
@johnG 对,实际上你没有查询,只需在表达式之前将其放入变量中。 - Magnus
非常感谢您的帮助。所以我可以得出结论,.count() 可以在空列表上工作,而 Sum() 则不能? - John John
1
@johnG Sum() 返回的类型与被汇总的列相同,但是在转换为 SQL 时,一个空查询返回 null,而 null 无法映射到 int。我会称之为提供程序中的一个错误。(例如,在空集合上使用 Linq-to-Object 会返回 0)。 - Magnus

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