不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
LINQ to Entities尝试将NULL转为System.Int32出错一例
编辑:dnawo 日期:2014-12-19
今天使用LINQ to Entities时出现了一个错误,为方便说明创建了个Demo表用于还原问题:
LINQ to Entities相关程序:
程序执行出错,错误信息如下:
引用内容

在SQL Server Profiler获取了对应SQL语句:
查询得到的记录集:
引用内容
所以,问题的原因是Where(item2 => item2.Age >= 30)导致了查询结果存在NULL值,在尝试将它转换成System.Int32时出了错,解决方法如下:
参考资料
[1].Stack Overflow:http://stackoverflow.com/questions/6864311/the-cast-to-value-type-int32-failed-because-the-materialized-value-is-null
复制内容到剪贴板
程序代码

create table Person
(
Id int identity(1,1) primary key,
Name nvarchar(20) not null,
Age int not null
)
insert into Person select 'person1',20
insert into Person select 'person2',30
insert into Person select 'person3',40
(
Id int identity(1,1) primary key,
Name nvarchar(20) not null,
Age int not null
)
insert into Person select 'person1',20
insert into Person select 'person2',30
insert into Person select 'person3',40
LINQ to Entities相关程序:
复制内容到剪贴板
程序代码

var context = new testContext();
var data = context.People
.GroupBy(item => item.Name)
.Select(item => new { item.FirstOrDefault().Name, Age = item.Where(item2 => item2.Age >= 30).Sum(item2 => item2.Age) });
foreach (var item in data)
{
Console.WriteLine("{0},{1}", item.Name, item.Age);
}
var data = context.People
.GroupBy(item => item.Name)
.Select(item => new { item.FirstOrDefault().Name, Age = item.Where(item2 => item2.Age >= 30).Sum(item2 => item2.Age) });
foreach (var item in data)
{
Console.WriteLine("{0},{1}", item.Name, item.Age);
}
程序执行出错,错误信息如下:

The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

在SQL Server Profiler获取了对应SQL语句:
复制内容到剪贴板
程序代码

Select
1 AS [C1],
[Project4].[C1] AS [C2],
[Project4].[C2] AS [C3]
FROM ( Select
[Project3].[C1] AS [C1],
(Select
SUM([Extent3].[Age]) AS [A1]
FROM [dbo].[Person] AS [Extent3]
Where ([Project3].[Name] = [Extent3].[Name]) AND ([Extent3].[Age] >= 30)) AS [C2]
FROM ( Select
[Distinct1].[Name] AS [Name],
(Select TOP (1)
[Extent2].[Name] AS [Name]
FROM [dbo].[Person] AS [Extent2]
Where [Distinct1].[Name] = [Extent2].[Name]) AS [C1]
FROM ( Select DISTINCT
[Extent1].[Name] AS [Name]
FROM [dbo].[Person] AS [Extent1]
) AS [Distinct1]
) AS [Project3]
) AS [Project4]
1 AS [C1],
[Project4].[C1] AS [C2],
[Project4].[C2] AS [C3]
FROM ( Select
[Project3].[C1] AS [C1],
(Select
SUM([Extent3].[Age]) AS [A1]
FROM [dbo].[Person] AS [Extent3]
Where ([Project3].[Name] = [Extent3].[Name]) AND ([Extent3].[Age] >= 30)) AS [C2]
FROM ( Select
[Distinct1].[Name] AS [Name],
(Select TOP (1)
[Extent2].[Name] AS [Name]
FROM [dbo].[Person] AS [Extent2]
Where [Distinct1].[Name] = [Extent2].[Name]) AS [C1]
FROM ( Select DISTINCT
[Extent1].[Name] AS [Name]
FROM [dbo].[Person] AS [Extent1]
) AS [Distinct1]
) AS [Project3]
) AS [Project4]
查询得到的记录集:

1 person1 NULL
1 person2 30
1 person3 40
1 person2 30
1 person3 40
所以,问题的原因是Where(item2 => item2.Age >= 30)导致了查询结果存在NULL值,在尝试将它转换成System.Int32时出了错,解决方法如下:
复制内容到剪贴板
程序代码

var data = context.People
.GroupBy(item => item.Name)
.Select(item => new { item.FirstOrDefault().Name, Age = item.Where(item2 => item2.Age >= 30).Sum(item2 => (int?)item2.Age) ?? 0 });
.GroupBy(item => item.Name)
.Select(item => new { item.FirstOrDefault().Name, Age = item.Where(item2 => item2.Age >= 30).Sum(item2 => (int?)item2.Age) ?? 0 });
参考资料
[1].Stack Overflow:http://stackoverflow.com/questions/6864311/the-cast-to-value-type-int32-failed-because-the-materialized-value-is-null






评论: 0 | 引用: 0 | 查看次数: 5682
发表评论
请登录后再发表评论!