Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换为int32时出现异常_C#_Linq To Sql - Fatal编程技术网

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)