I am using the below statement with the intent of getting all of the machine objects from the MachineList
collection (type IEnumerable) that have a MachineStatus
of i. The MachineList
collection will not always contain machines with a status of i.
At times when no machines have a MachineStatus
of i I'd like to return an empty collection. My call to ActiveMachines
(which is used first) works but InactiveMachines
does not.
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");
}
}
Edit
Upon further examination it appears that any enumeration of MachineList
will cause subsequent enumerations of MachineList
to throw an exeception: Object reference not set to an instance of an object
.
Therefore, it doesn't matter if a call is made to ActiveMachines
or InactiveMachines
as its an issue with the MachineList
collection. This is especially troubling because I can break calls to MachineList
simply by enumerating it in a Watch before it is called in code. At its lowest level MachineList
implements NHibernate.IQuery
being returned as an IEnumerable
. What's causing MachineList
to lose its contents after an initial enumeration?
It will return an empty enumerable.
If you have a Query that returns a empty set then ToList returns null. You would probably expect it to return an empty list (Count = 0), which is the case when using data providers for SQL Server.
Empty collection. Always. It is considered a best practice to NEVER return null when returning a collection or enumerable. ALWAYS return an empty enumerable/collection.
Some functions return arrays, which appear like a pointer to an object. However, if a function has the option of returning an array or indicating that a valid array is not possible, it should not return NULL . Instead, the function should return an empty array.
Where
returns an empty sequence if there are no matches; this is a perfectly valid sequence (not null). The only way you'd get a null is if you call FirstOrDefault
or SingleOrDefault
.
Are you sure the bug is where you think it is?
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
By default, Enumerable.Where already does return an empty IEnumerable<T>
, not null. If you are seeing "Object reference not set to an instance of an object." exceptions, it's most likely that something else is the problem.
Is MachineList null, perhaps? If you hadn't created it, you'd get that exception on your call to .Where(...)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With