Возвращает пустую коллекцию, когда 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>();