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?

¿Fue útil?

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>();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top