Linq List.Select抛出null引用异常,但List.First不抛出

时间:2012-07-26 11:02:11

标签: c# linq nullreferenceexception

我有一个返回一个项目的linq查询。 当我执行myList.Select(p => p.ID)时会抛出空引用异常,但是,如果我myList.First().ID它就没问题了。 我已经尝试myList.ToList().Select(p => p.ID)并且也失败了。

最离奇的是,它适用于另一台电脑......

有什么想法吗?

代码更新

   var test = A2012_DomainDB.GetGadgetDomainsForUser(userID);
   var viewableGadgetIDs = test.Where(p => p != null).Select(p => p.GadgetID); // this line fails 

public static IEnumerable<A2012_Domain_Gadget> GetGadgetDomainsForUser(int userID)
    {
        var db = Database_Factory.EVISION_EMAGINE_DB;
        var viewableDomainIDs = GetDomainsForUser(userID).Select(p => p.DomainID);
        var result = db.A2012_Domain_Gadget.Where(p => viewableDomainIDs.Contains(p.DomainID));
        return result;
    }

  public static List<A2012_Domain> GetDomainsForUser(int userID)
    {
        var db = Database_Factory.EVISION_EMAGINE_DB;
        List<int> viewableIDs = new List<int>();
        List<A2012_Domain> domains = new List<A2012_Domain>();

        viewableIDs.AddRange(db.A2012_Domain_User.Where(p => p.UserID == userID).Select(p => p.DomainID));                        

        viewableIDs.ForEach(i =>
        {
            domains.Add(db.A2012_Domain.Where(p => p.DomainID == i).Single());
        });

        return domains;
    }

1 个答案:

答案 0 :(得分:2)

我无法确切地知道这会来自何处。应该推迟GetGadgetDomainsForUser查询,直到您实际迭代返回的viewableGadgetIDs,但您似乎暗示在运行该行时会发生异常。

我真正建议的是尝试null保护所有lambda表达式:

var result = db.A2012_Domain_Gadget
                 .Where(p => p != null)
                 .Where(p => viewableDomainIDs.Contains(p.DomainID));

viewableIDs.AddRange(
    db.A2012_Domain_User
        .Where(p => p != null)
        .Where(p => p.UserID == userID)
        .Select(p => p.DomainID));                        

viewableIDs.ForEach(i =>
{
    domains.Add(
        db.A2012_Domain
           .Where(p => p != null)
           .Where(p => p.DomainID == i)
           .Single());
});

我最想说错误来自这里:

var result = db.A2012_Domain_Gadget.Where(p => viewableDomainIDs.Contains(p.DomainID));

或许对db的查询产生一个空项,然后在p.DomainID中使用该项而不进行空检查。

相关问题