質問

MachineListコレクションが i であるMachineStatusコレクション(IEnumerable型)からすべてのマシンオブジェクトを取得する目的で、以下のステートメントを使用しています。 ActiveMachinesコレクションには、ステータスが i のマシンが常に含まれるとは限りません。

i InactiveMachinesを持つマシンが存在しない場合、空のコレクションを返します。 Object reference not set to an instance of an object(最初に使用される)への呼び出しは機能しますが、NHibernate.IQueryは機能しません。

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

編集

さらに調べてみると、IEnumerableの列挙により、以降の<=>の列挙が例外をスローするようです:<=>。

したがって、<=>コレクションの問題として<=>または<=>の呼び出しが行われたかどうかは関係ありません。これは、コードで呼び出される前にWatchで列挙するだけで<=>の呼び出しを中断できるため、特に厄介です。最下位レベルの<=>は、<=>として返される<=>を実装します。 <=>が最初の列挙後に内容を失う原因は何ですか?

役に立ちましたか?

解決

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

他のヒント

デフォルトでは、 Enumerable.Where はすでに空を返しますIEnumerable<T>、nullではありません。 <!> quot;オブジェクトのインスタンスに設定されていないオブジェクト参照が表示されている場合。<!> quot;例外として、他の何かが問題である可能性が高いです。

MachineListはnullですか?作成していない場合、.Where(...)

の呼び出しで例外が発生します。

さらに、空のコレクションを明示的に返す場合、これが役立ちます...

Enumerable.Empty<Machine>();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top