我有一个返回一个项目的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;
}
答案 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
中使用该项而不进行空检查。