Devuelve una colección vacía cuando Linq donde no devuelve nada
-
10-07-2019 - |
Pregunta
Estoy usando la siguiente declaración con la intención de obtener todos los objetos de la máquina de la colección MachineList
(tipo IEnumerable) que tienen un MachineStatus
de i . La colección ActiveMachines
no siempre contendrá máquinas con un estado de i .
A veces, cuando ninguna máquina tiene un InactiveMachines
i me gustaría devolver una colección vacía. Mi llamada a Object reference not set to an instance of an object
(que se usa primero) funciona pero NHibernate.IQuery
no.
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");
}
}
Editar
Tras un examen más detallado, parece que cualquier enumeración de IEnumerable
hará que las enumeraciones posteriores de <=> arrojen una excepción: <=>.
Por lo tanto, no importa si se realiza una llamada a <=> o <=> ya que es un problema con la colección <=>. Esto es especialmente problemático porque puedo interrumpir las llamadas a <=> simplemente enumerándolo en Watch antes de que se llame en código. En su nivel más bajo, <=> implementa <=> siendo devuelto como <=>. ¿Qué está causando que <=> pierda su contenido después de una enumeración inicial?
Solución
Where
devuelve una secuencia vacía si no hay coincidencias; Esta es una secuencia perfectamente válida (no nula). La única forma de obtener un valor nulo es si llama a FirstOrDefault
o SingleOrDefault
.
¿Estás seguro de que el error está donde crees que está?
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
Otros consejos
Por defecto, Enumerable.Where ya devuelve un vacío IEnumerable<T>
, no es nulo. Si está viendo & Quot; La referencia de objeto no está establecida en una instancia de un objeto. & Quot; excepciones, es muy probable que el problema sea otra cosa.
¿Es MachineList nulo, tal vez? Si no lo hubiera creado, obtendría esa excepción en su llamada a .Where(...)
Además, si desea devolver explícitamente una colección vacía, esto puede ayudar ...
Enumerable.Empty<Machine>();