C# 转换为int32时出现异常
执行此代码时,我在最后一行收到一个错误。该如何重写以避免异常C# 转换为int32时出现异常,c#,linq-to-sql,C#,Linq To Sql,执行此代码时,我在最后一行收到一个错误。该如何重写以避免异常 var q = from i in dbconnect.tblMaterialTenderGroups join b in dbconnect.tblMaterials on i.materialId equals b.materialId join f in dbconnect.tblFactoryRequests on b.requestId equals f.
var q = from i in dbconnect.tblMaterialTenderGroups
join b in dbconnect.tblMaterials on i.materialId equals b.materialId
join f in dbconnect.tblFactoryRequests on b.requestId equals f.requestId
where i.MaterialGroupId == materialGroupId && f.propertyFactoryCenteralId.Contains(facName)
select b;
int ab= q.Count();
int? sum = q.Sum(g => Convert.ToInt32(g.requestAmount));
这个选项是
System.InvalidOperationException:无法将空值分配给
类型为System.Int32的成员,该类型是不可为null的值类型
g.requestAmount
的类型为nvarchar(100)
将强制转换添加到可为空的整数:
int? sum = q.Sum(g => (int?)Convert.ToInt32(g.requestAmount));
有趣的是,无论您是否添加铸造,都会生成完全相同的查询。它看起来像:
SELECT SUM([t1].[value]) AS [value]
FROM (
SELECT CONVERT(Int,[t0].[requestAmount]) AS [value], [t0].[Id]
FROM [dbo].[People] AS [t0]
) AS [t1]
WHERE ...
当您有一些行要求和时,它返回整数值。但是,如果没有要求和的内容(即所有行都被过滤掉),该怎么办?在这种情况下,数据库查询将返回NULL
这里我们应该理解LINQtoSQL对返回值的作用。对于IQueryable
,存在两种不同的Sum
扩展:
int-Sum(此IQueryable源代码,表达式选择器)
可为空的和(此IQueryable源、表达式选择器)
第一个尝试将查询结果分配给整数值(这会给您一个异常)。第二个尝试将查询结果分配给可为空的整数。所以,您只需调用第二个
Sum
方法,当您将选择器结果强制转换为可空类型时,会调用该方法。当EF尝试具体化查询结果时,会发生这种异常。某些结果字段包含空值,但映射到该字段的实体属性(或匿名类型,在使用投影时为Select
)是int
,而不是int?
如果你仔细查看堆栈跟踪,你会得到一个实体,它应该声明
int?
属性。什么类型g.requestAmount
是什么?我的查询结果是null,它的类型是isnvarchar(100)。如果q.Count()==0
,你想返回什么?@Spad:你能发布一个异常堆栈跟踪吗?
int Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int>> selector)
Nullable<int> Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, Nullable<int>>> selector)