左连接出现LINQ错误
本文关键字:LINQ 错误 连接 | 更新日期: 2023-09-27 18:09:25
我是linq的新手,所以我会感谢你的帮助,让这个左连接查询工作。
我有"列表小时"(0-23小时的列表),我想与"var hourlyData"(包含聚合数据的处理linq查询)左连接。我在左连接的尝试是"var reportData"。
DataSet ds = GetDataSet(sSql);
var stats = ds.Tables[0].AsEnumerable();
var hourlyData = from stat in stats
group stat by stat.Field<int>("Hour") into g
select new
{
Hour = g.Key,
Value = g.Key.ToString(),
D1 = g.Sum(stat => stat.Field<int>("D1")),
D2 = g.Sum(stat => stat.Field<int>("D2")),
D3 = g.Sum(stat => stat.Field<decimal>("D3"))
};
List<int> hours = new List<int>();
for (int i = 0; i < 24; i++)
{
hours.Add(i);
}
var reportData = from hour in hours.AsEnumerable()
join stat in hourlyData.AsEnumerable()
on hour equals stat.Hour
into sts2
from stat2 in sts2.DefaultIfEmpty()
select new
{
Hour = hour,
Value = hour,
D1 = stat2.D1 != null ? stat2.D1 : 0,
D2 = stat2.D2 != null ? stat2.D2 : 0,
D3 = stat2.D3 != null ? stat2.D3 : 0
};
上面的代码会产生如下错误:
Exception Details: System。NullReferenceException:对象引用没有设置为对象的实例。
源错误:
Line 135: into sts2
Line 136: from stat2 in sts2.DefaultIfEmpty()
Line 137: select new
Line 138: {
Line 139: Hour = hour,
...
谢谢!
它给你一个NRE,因为sts2.DefaultIfEmpty()返回null。在这种情况下,你需要让你的D1, D2和D3在你的select语句中有相同的默认值,如果null:
D1 = stat2 != null ? stat2.D1 : 0,
D2 = stat2 != null ? stat2.D2 : 0,
D3 = stat2 != null ? stat2.D3 : 0,
由于您正在进行左连接并且stat2可以为空,因此您必须处理它可能为空的情况。
试
select new
{
Hour = hour,
Value = hour,
D1 = stat2 != null ? stat2.D1 : 0,
D2 = stat2 != null ? stat2.D2 : 0,
D3 = stat2 != null ? stat2.D3 : 0
};
注意:0
可能不适合您的情况;
看一下:http://msdn.microsoft.com/en-us/vcsharp/aa336746