我有以下代码:
IList<CmsUserPermissionGroup> matchingRoles = PermissionGroups.Where(r => r.JournalCode.ToLower() == journalCode.ToLower())
.Where(r => r.CmsRole.ToLower() == role.ToLower())
.Where(r => r.AccessLevel > 0)
如果没有返回结果,我假设将返回一个空列表。实际返回的是以下错误:
未将对象引用设置为对象的实例。
描述:在执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。
异常详细信息: System.NullReferenceException:未将对象引用设置为对象的实例。
我误解了什么吗?还有其他选择吗?
答案 0 :(得分:3)
如果查询没有问题,将返回空枚举。
此处的问题出在您的Where()
声明中。在JournalCode
中的某个对象上,CmsRole
或journalCode
为空(假设您已在其他位置检查了role
和PermissionGroups
为空值)。当您对该值调用ToLower()
时,它会抛出上述异常。
您可以通过以下方式保护自己:
if(!String.IsNullOrEmpty(journalCode) && !String.IsNullOrEmpty(role))
{
Roles =
PermissionGroups
.Where(r => r.JournalCode != null
&& r.JournalCode.Equals(journalCode,
StringComparison.InvariantCultureIgnoreCase))
.Where(r => r.CmsRole != null
&& r.CmsRole.Equals(role,
StringComparison.InvariantCultureIgnoreCase))
.Where(r => r.AccessLevel > 0);
}
答案 1 :(得分:2)
如果没有返回结果,将返回一个空序列并且谓词成功。
实际上,对于某些元素,r
似乎为空,或者某些元素的r.JournalCode
为空,或者journalCode
为空,或者r.CmsRole
为某些元素为null,或role
为null。 LINQ不会阻止这些异常冒泡。