使用Linq Where子句时返回Object的问题

时间:2011-09-07 14:02:04

标签: c# linq c#-4.0

我有以下代码:

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:未将对象引用设置为对象的实例。

我误解了什么吗?还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

如果查询没有问题,将返回空枚举。

此处的问题出在您的Where()声明中。在JournalCode中的某个对象上,CmsRolejournalCode为空(假设您已在其他位置检查了rolePermissionGroups为空值)。当您对该值调用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不会阻止这些异常冒泡。