当Linq没有返回时返回一个空集合

我正在使用以下语句,目的是从MachineList集合(类型IEnumerable)获取具有iMachineStatus的所有机器对象。 MachineList集合不会始终包含状态为i的计算机

有时没有机器有我的MachineStatus我想要返回一个空集合。 我对ActiveMachines (首先使用)的调用有效但InactiveMachines没有。

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

编辑

经过进一步检查,似乎MachineList任何枚举都会导致MachineList后续枚举抛出exception: Object reference not set to an instance of an object

因此,调用ActiveMachinesInactiveMachines作为MachineList集合的问题并不重要。 这尤其令人不安,因为我可以通过在Watch中调用它来调用MachineList ,然后再在代码中调用它。 在最低级别, MachineList实现了NHibernate.IQuery作为IEnumerable返回。 什么导致MachineList在初始枚举后丢失其内容?

如果没有匹配则返回空序列; 这是一个完全有效的序列(非空)。 获得null的唯一方法是调用FirstOrDefaultSingleOrDefault

你确定这个bug是你认为的吗?

 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 

默认情况下, Enumerable.Where已经返回一个空的IEnumerable ,而不是null。 如果您看到“对象引用未设置为对象的实例”。 例外,最有可能的是其他问题。

可能是MachineList为null吗? 如果您还没有创建它,那么您在调用.Where(...)会遇到exception

此外,如果您希望显式返回空集合,这可以帮助…

 Enumerable.Empty();