Frage

Ich bin mit dem folgende Statement mit der Absicht, alle Maschinen Objekte aus der Sammlung MachineList (Typ IEnumerable) erhalten, die eine MachineStatus von hat i . Die MachineList Sammlung wird nicht immer enthalten Maschinen mit einem Status von i .

Manchmal, wenn keine Maschinen haben eine MachineStatus von i Ich möchte eine leere Sammlung zurückzukehren. Mein Aufruf an ActiveMachines (das erste Mal verwendet wird) funktioniert, aber InactiveMachines nicht.

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

Bearbeiten

Bei der weiteren Untersuchung scheint es, dass jede Aufzählung von MachineList nachfolgenden Aufzählungen von MachineList verursacht einen exeception zu werfen. Object reference not set to an instance of an object

Daher spielt es keine Rolle, ob ein Anruf als ein Problem mit der ActiveMachines Sammlung InactiveMachines oder MachineList gemacht wird. Dies ist besonders beunruhigend, weil ich kann Anrufe brechen einfach MachineList indem er in einem Video-aufzählt, bevor es in Code aufgerufen wird. Auf seinem niedrigsten Niveau MachineList implementiert NHibernate.IQuery als IEnumerable zurückgegeben wird. Was verursacht MachineList seinen Inhalt nach einer anfänglichen Aufzählung zu verlieren?

War es hilfreich?

Lösung

Where gibt eine leere Sequenz, wenn es keine Übereinstimmungen sind; dies ist eine absolut gültige Sequenz (nicht null). Die einzige Möglichkeit, einen Null bekäme, wenn Sie FirstOrDefault oder SingleOrDefault nennen.

Sind Sie sicher, dass der Fehler ist, wo Sie denken, es ist?

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

Andere Tipps

Standardmäßig Enumerable.Where bereits zurückgibt einen leeren IEnumerable<T>, nicht null. Wenn Sie sehen, „Objektverweis auf eine Instanz eines Objekts nicht festgelegt.“ Ausnahmen, es ist sehr wahrscheinlich, dass etwas anderes das Problem ist.

Ist Maschinenliste null, vielleicht? Wenn Sie es nicht angelegt hatte, würden Sie diese Ausnahme auf Ihren Anruf .Where(...) bekommen

Außerdem, wenn Sie möchten explizit eine leere Auflistung zurück, so kann helfen ...

Enumerable.Empty<Machine>();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top