Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq List.Select抛出空引用异常,但List.First不抛出空引用异常_C#_Linq_Nullreferenceexception - Fatal编程技术网

C# Linq List.Select抛出空引用异常,但List.First不抛出空引用异常

C# Linq List.Select抛出空引用异常,但List.First不抛出空引用异常,c#,linq,nullreferenceexception,C#,Linq,Nullreferenceexception,我有一个linq查询,返回一个项目。 当我执行myList.Selectp=>p.ID时,它会抛出空引用异常,然而,如果我执行myList.First.ID,就可以了。 我已经尝试过myList.ToList.Selectp=>p.ID,但也失败了 最奇怪的是它在另一台电脑上工作 有什么想法吗 代码更新 我真的看不出这到底是从哪里来的。GetGadgetDomainsForUser查询应该推迟到您实际迭代返回的ViewableGadgetId之后,但您似乎暗示在仅运行该行时会发生异常 我真正能建

我有一个linq查询,返回一个项目。 当我执行myList.Selectp=>p.ID时,它会抛出空引用异常,然而,如果我执行myList.First.ID,就可以了。 我已经尝试过myList.ToList.Selectp=>p.ID,但也失败了

最奇怪的是它在另一台电脑上工作

有什么想法吗

代码更新


我真的看不出这到底是从哪里来的。GetGadgetDomainsForUser查询应该推迟到您实际迭代返回的ViewableGadgetId之后,但您似乎暗示在仅运行该行时会发生异常

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

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

我很想说,错误来自这里:

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

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

列表中只有一个项,您如何处理生成的IEnumerable?也许空引用发生在其他地方。它出现在第一句话中:@AdamBilinski足够公平,一定掩盖了这一点。在这种情况下,假设这是linq to objects,则更可能的情况是null ref稍后出现。你能发布显示这些行正在使用的代码吗?这两种情况是不等价的,一种返回int,另一种返回IEnumerable,因此消费代码也必须更改。更改该选项时,您可能已经解决了异常问题,这意味着从.Select到.First的更改实际上是一种误导。如果将GetGadgetDomainsForser设置为return result.ToList而不是result,会发生什么情况。异常是否移动?@AdamBilinski已排序?GetGadgetDomainsForser中的问题到底是什么?不管怎样,很高兴为你安排好了。
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));