如果缺少列表项名称,则无法捕获

时间:2014-01-14 16:32:37

标签: asp.net-mvc linq entity-framework-4

我有以下代码,groupBY我的表,并根据型号名称选择计数: -

var IT360Counts = entities.Resources.Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true))
  .GroupBy(a => a.SystemInfo.MODEL.ToLower())
  .Select(g => new
  {
      Action = g.Key.ToLower(),
      ItemCount = g.Count()
  }).ToLookup(a => a.Action);

然后我会参考var内容,例如: -

 IT360RouterNo =  IT360Counts["router"] == null ? 0 : IT360Counts["router"].SingleOrDefault().ItemCount,

上面的方法效果很好,除非第一个查询没有任何路由器,那么第二个语句将始终返回null异常。所以我的问题是如果IT360Counts [“路由器”]存在,天气还有一种方法可以解决吗?

由于

1 个答案:

答案 0 :(得分:1)

IT360Counts["router"]不为空而是空列表时,会发生这种情况。在这种情况下,IT360Counts["router"].SingleOrDefault()将返回null,因此在访问其ItemCount属性时,您将获得null异常。

这是因为Lookup中的索引器在找不到密钥时返回空列表。见remarks section in msdn。尝试检查查找是否包含密钥IT360Counts.Contains("router")。这样你就可以:

IT360RouterNo =  IT360Counts.Contains("router") ? IT360Counts["router"].SingleOrDefault().ItemCount : 0,

作为旁注,您是否还考虑过使用ToDictionary代替ToLookup?字典键将是您的Action和ItemCount的值,因此在检索值时,您只需获取字典中的值"router"等键。如果你总是在做.SingleOrDefault().ItemCount从不期望有多个具有相同动作的项目,那么你可能更适合使用字典。

为了完成,这个想法将是:

var IT360Counts = entities.Resources.Where(a => String.IsNullOrEmpty(a.ASSETTAG) &&(a.SystemInfo.ISSERVER == true))
                          .GroupBy(a => a.SystemInfo.MODEL.ToLower())
                          .Select(g => new
                          {
                              Action = g.Key.ToLower(),
                              ItemCount = g.Count()
                          }).ToDictionary(a => a.Action, a => a.ItemCount);

IT360RouterNo =  IT360Counts.ContainsKey("router") ? IT360Counts["router"] : 0,

希望它有所帮助!