linQ group by / select - 对象引用未设置为对象的实例

时间:2013-04-08 01:12:16

标签: c# linq datatable

我正在尝试创建一个linQ查询,它将产生与此SQL相同的结果:

SELECT Priority.PriorityKey, Count(Priority.PriorityKey) AS NewPresentingUnits
FROM Priority INNER JOIN SupportPeriod ON Priority.PriorityCode = SupportPeriod.PriorityCode
WHERE (((SupportPeriod.NewClient)=True) AND ((SupportPeriod.DateAssistanceRequested) Between #1/1/2013# And #2/1/2013#) AND ((SupportPeriod.DateFinished) Between #1/1/9999# And #12/31/9999#))
GROUP BY Priority.PriorityKey;

运行SQL查询时,我得到以下结果:

https://docs.google.com/file/d/0B6b_N7sDgjmvRlBtT1lZWURERVU/edit?usp=sharing

这是linQ声明:

    SupportPeriodTableAdapter spTa = new SupportPeriodTableAdapter();
    SupportPeriodDataTable dataTables = spTa.GetData();
        var test = (from sp in dataTables
                  where (sp.NewClient == true) &&
                      (sp.DateAssistanceRequested >= new DateTime(2013, 1, 1) &&
                      sp.DateAssistanceRequested <= new DateTime(2013, 2, 1)) &&
                      (sp.DateFinished > new DateTime(2013, 2, 1))
                  group sp by sp.PriorityRow.PriorityKey into groupz
                  select new { Key = groupz.Key, sount = groupz.Count() });

当我尝试调试var test时,我在结果视图中得到“对象引用未设置为对象的实例”。

https://docs.google.com/file/d/0B6b_N7sDgjmvdGp0bjJCNkE3TTg/edit?usp=sharing

我是初次使用linQ的'group by'和'select new'功能,因此我很难搞清楚这个......

1 个答案:

答案 0 :(得分:0)

我认为你的数据加载出了问题。

我会检查dataTables中的所有行是否都有PriorityRow

如果某些行上没有PriorityRow,则该组失败。 在这种情况下,您可以将linq更改为:

 var test = (from sp in dataTables
             where (sp.NewClient == true) &&
                   (sp.DateAssistanceRequested >= new DateTime(2013, 1, 1) &&
                    sp.DateAssistanceRequested <= new DateTime(2013, 2, 1)) &&
                   (sp.DateFinished > new DateTime(2013, 2, 1))
             group sp by sp.PriorityRow != null 
                               ? sp.PriorityRow.PriorityKey 
                               : "not key"
                      into groupz
             select new { Key = groupz.Key, sount = groupz.Count() });

使用: sp由sp.PriorityRow组成的组!= null? sp.PriorityRow.PriorityKey:“not key”进入groupz