我使用下面的语句的目的是从MachineList集合(IEnumerable类型)中获取所有iMachineStatus的机器对象。MachineList集合并不总是包含状态为i的机器。
当没有机器有i的MachineStatus时,我想返回一个空集合。我对ActiveMachines的调用(首先使用)起作用,但InactiveMachines不起作用。

public IEnumerable<Machine> ActiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "a");
    }
}

public IEnumerable<Machine> InactiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "i");
    }
}

编辑
经过进一步的检查,似乎任何MachineList的枚举都会导致随后的MachineList枚举抛出一个execption:Object reference not set to an instance of an object
因此,调用ActiveMachinesInactiveMachines作为MachineList集合的问题并不重要。这尤其麻烦,因为我可以通过在代码中调用MachineList之前在监视中枚举它来中断对它的调用。在其最低级别MachineList实现NHibernate.IQuery作为IEnumerable返回。什么原因导致在初始枚举之后MachineList丢失其内容?

最佳答案

Where如果没有匹配项,则返回一个空序列;这是一个完全有效的序列(非空)。获得空值的唯一方法是调用FirstOrDefaultSingleOrDefault
你确定虫子在你想的地方吗?

int?[] nums = { 1, 3, 5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true

07-27 17:37