2009-12-18 117 views
1

我有这段代码。如何使用SingleOrDefault方法检查空值?如何检查使用LINQ的空值

public static List<ETY.Rol> GetRolesByApplicationAndCompany(this UsuarioContext usuario, int company, int app) 
     { 
      List<ETY.Company> lCompanies= usuario.Companies; 

      var roles = lCompanies. 
       SingleOrDefault(e => (e.Id == company)).Applications. 
       SingleOrDefault(a => a.Id == app).Roles; 
      return roles; 

     } 

回答

0

你的意思返回null或一个空列表,如果任何SingleOrDefault回报的空?在这种情况下:

var company = lCompanies.SingleOrDefault(e => (e.Id == company)); 
if(company != null) { 
    var application = company.Applications.SingleOrDefault(a => a.Id == app); 
    if(application!=null) { 
     return application.Roles; 
    } 
} 
return null; //Or: return new List<ETY.Rol>(); 
1

你可以尝试寻找一个可能/ IfNotNull扩展方法(herehere)。

或者使用Linq的语法像这样(未经):

var q = from company in lCompanies.SingleOrDefault(e => e.Id == company) 
     where company != null 
     let application = company.Applications.SingleOrDefault(a => a.Id == app) 
     where application != null 
     select application.Roles; 

Greg Beech's answer是更好,如果单条件有保证)

+0

我很肯定你的第一行不会编译,因为它会返回一个不是IEnumerable的公司,这个公司不是。 – 2009-12-18 09:07:23

0

而不是使用SingleOrDefault可以按如下方式编写链接查询。你失去了确保只有一个应用程序或公司的语义,但是如果你知道总是这样,那么它不应该是一个问题。

return from c in lCompanies where c.Id == company 
     from a in c.Applications where a.Id == app 
     select a.Roles;