我有以下代码,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 [“路由器”]存在,天气还有一种方法可以解决吗?
由于
答案 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,
希望它有所帮助!