左连接LINQ错误

时间:2011-09-20 20:56:13

标签: c# asp.net linq

我是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
                 };

上面的代码会产生此错误:

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

来源错误:

Line 135:                            into sts2
Line 136:                         from stat2 in sts2.DefaultIfEmpty()
Line 137:                         select new
Line 138:                         {
Line 139:                             Hour = hour,
 ...

谢谢!

3 个答案:

答案 0 :(得分:0)

由于您正在进行左连接并且stat2可以为null,因此您必须处理它可以为null的情况。

尝试

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可能不适合您的情况;使用合适的东西。

答案 1 :(得分:0)

答案 2 :(得分:0)

它给你一个NRE,因为sts2.DefaultIfEmpty()返回null。在这些情况下,如果为null,则需要使select语句中的D1,D2和D3赋值具有合理的默认值:

D1 = stat2 != null ? stat2.D1 : 0,
D2 = stat2 != null ? stat2.D2 : 0,
D3 = stat2 != null ? stat2.D3 : 0,