Restituisce una raccolta vuota quando Linq non restituisce nulla
-
10-07-2019 - |
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?
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>();