私は以下のステートメントを使用しています。MachineList
を持つコレクション(タイプIEnumerable)MachineStatus
の私。のMachineList
コレクションには、常にステータスが次のマシンが含まれるわけではありません私。
どのマシンにもMachineStatus
の私空のコレクションを返したいのですが。私の電話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
欺瞞を投げる:Object reference not set to an instance of an object
。
したがって、電話がかかってきたかどうかは関係ありません。ActiveMachines
またはInactiveMachines
その問題としてMachineList
コレクション。私はに電話を切ることができるのでこれは特に厄介ですMachineList
コードで呼び出される前に、単にWatchでそれを列挙することによって。最低レベルMachineList
実装するNHibernate.IQuery
として返されるIEnumerable
。原因は何ですかMachineList
最初の列挙後にその内容を失うのですか?
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.Empty<Machine>();
MachineStatus
例外をスローしているファサードプロパティです - すなわちpublic string MachineStatus { get {return someInnerField.Status;}}
そしてsomeInnerField
ですnull
。 - Marc Gravell♦IEnumerable
複数回。消費するときに同意する暗黙の契約IEnumerable
一度だけ列挙することです。だから、本当の答えはあなたの同僚が複数の列挙を許すように彼のコードを変更することではありません、しかしあなたがするためにCustomer.MachineList.ToList()
ある時点で、その後は結果のリストのみを使用します(または、新しいリストを取得します。IEnumerable
再び)。あなたは怠惰な評価をすることができます。キャッシュすることはできますが、2回列挙しないでください。を公開することもできますIQueryable
そしてそれも複数回呼び出します。 - ErikE