返回一个空集时,LINQ的地方没有返回
-
10-07-2019 - |
题
我使用下面的语句让所有的计算机对象从MachineList
集合(IEnumerable类型)的原意,即具有的一MachineStatus
I 的。该ActiveMachines
集合不会总是包含与机器的状态的 I 的。
有时在没有机具有的的 I 的一个InactiveMachines
我想返回一个空的集合。我的呼叫到Object reference not set to an instance of an object
(其用于第一)工作,但NHibernate.IQuery
没有。
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");
}
}
修改强>
在进一步的检查看来IEnumerable
的任何枚举会造成后续<=>枚举抛出exeception:<=>
因此,它不会有一个呼叫作出<=>或<=>作为其与<=>收集的问题无关紧要。这是特别麻烦,因为我可以打破呼吁通过在观看枚举它这就是所谓的代码之前根本<=>。在最低水平<=>工具<=>返回作为<=>。是什么造成<=>初步统计后失去它的内容是什么?
解决方案
Where
如果没有匹配,则返回一个空的序列;这是一个完全有效的序列(不为空)。你会得到一个空的唯一方法是,如果你打电话FirstOrDefault
或SingleOrDefault
。
您确定错误是你认为它是什么?
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<T>
,不为null。 ,如果你看到“对象引用不设置到对象的实例。”例外,它最有可能是别的什么东西的问题。
时MachineList空,也许?如果你没有创造它,你会得到你的电话到异常.Where(...)
此外,如果你想明确地返回一个空的集合,这可以帮助...
Enumerable.Empty<Machine>();
不隶属于 StackOverflow