Возвращает пустую коллекцию, когда Linq where ничего не возвращает
я использую приведенное ниже утверждение с целью получения всех объектов машины из MachineList
коллекция (тип IEnumerable), которая имеет MachineStatus
of Я. The MachineList
коллекция не всегда будет содержать машины со статусом Я.
в моменты, когда ни одна машина не имеет MachineStatus
of Я я хотел бы вернуть пустую коллекцию. Мой призыв к ActiveMachines
(который используется первым) работает, но InactiveMachines
тут не.
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");
}
}
редактировать
при дальнейшем рассмотрении оказывается, что любое перечисление MachineList
вызовет последующие перечисления MachineList
бросить exeception: Object reference not set to an instance of an object
.
поэтому неважно, если вызов ActiveMachines
или InactiveMachines
как его проблема с MachineList
коллекция. Это особенно беспокоит, потому что я могу разбить звонки на MachineList
просто перечисляя его в часах, прежде чем он будет вызван в коде. На его самый низкий уровень MachineList
осуществляет NHibernate.IQuery
возвращается как IEnumerable
. Что вызывает MachineList
потерять его содержимое после первоначального перечисления?
3 ответов
Where
возвращает пустую последовательность, если совпадений нет; это совершенно допустимая последовательность (не null). Единственный способ получить null - это вызвать FirstOrDefault
или SingleOrDefault
.
вы уверены, что ошибка там, где вы думаете, что это?
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
по умолчанию перечисли.Где уже возвращает пустой IEnumerable<T>
, не null. Если вы видите "ссылка на объект не указывает на экземпляр объекта.- скорее всего, проблема в чем-то другом.
является ли MachineList нулевым, возможно? Если бы вы не создали его, вы бы получили это исключение при вызове .Where(...)
кроме того, если вы хотите явно возвращать пустую коллекцию, это может помочь...
Enumerable.Empty<Machine>();