Domanda

Sto usando l'istruzione seguente con l'intento di ottenere tutti gli oggetti macchina dalla raccolta MachineList (tipo IEnumerable) che hanno un MachineStatus di i . La ActiveMachines raccolta non conterrà sempre macchine con uno stato i .

A volte in cui nessuna macchina ha un InactiveMachines i vorrei restituire una raccolta vuota. La mia chiamata a Object reference not set to an instance of an object (che viene utilizzata per prima) funziona ma NHibernate.IQuery non funziona.

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");
    }
}

Modifica

Dopo un ulteriore esame sembra che qualsiasi enumerazione di IEnumerable provocherà una successiva esecuzione di enumerazioni di <=>: <=>.

Pertanto, non importa se viene effettuata una chiamata a <=> o <=> poiché si tratta di un problema con la raccolta <=>. Ciò è particolarmente preoccupante perché posso interrompere le chiamate a <=> semplicemente enumerandole in un Watch prima che venga chiamato nel codice. Al suo livello più basso <=> implementa <=> restituito come <=>. Che cosa sta causando a <=> di perdere il suo contenuto dopo un'enumerazione iniziale?

È stato utile?

Soluzione

Where restituisce una sequenza vuota se non ci sono corrispondenze; questa è una sequenza perfettamente valida (non nulla). L'unico modo per ottenere un null è se chiami FirstOrDefault o SingleOrDefault.

Sei sicuro che il bug sia dove pensi che sia?

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

Altri suggerimenti

Per impostazione predefinita, Enumerable.Where restituisce già un valore vuoto IEnumerable<T>, non nullo. Se vedi & Quot; Riferimento oggetto non impostato su un'istanza di un oggetto. & Quot; eccezioni, è molto probabile che qualcos'altro sia il problema.

MachineList è null, forse? Se non lo avessi creato, otterrai l'eccezione nella tua chiamata a .Where(...)

Inoltre, se desideri restituire esplicitamente una raccolta vuota, questo può aiutarti ...

Enumerable.Empty<Machine>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top