我使用下面的語句,讓所有從MachineList
集合(IEnumerable類型)機器對象的意圖有的MachineStatus
我。 MachineList
系列並不總是包含狀態爲i的機器。返回一個空集時,LINQ的地方沒有返回
當沒有機器有MachineStatus
i我想返回一個空集合。我致電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
集合的問題時,無關緊要。這特別令人煩惱,因爲我可以在調用代碼之前簡單地通過在Watch中枚舉來打斷MachineList
。在其最低級MachineList
實施NHibernate.IQuery
作爲IEnumerable
返回。導致MachineList
在初始枚舉後失去內容的原因是什麼?
沒,沒什麼枚舉時發生特殊情況;看看調試器中的「不活動」等是很有趣的。我還想知道(例如)'MachineStatus'是否是一個拋出異常的facade屬性 - 即'public string MachineStatus {get {return someInnerField.Status;}}'someInnerField'是'null'。 – 2009-11-30 23:05:49
真正的問題是你多次枚舉一個'IEnumerable'。您在使用「IEnumerable」時同意的隱式合約僅列舉一次!所以真正的答案不是讓你的同事改變他的代碼以允許多次枚舉,而是讓你在某個時間點執行'Customer.MachineList.ToList()',然後只使用結果列表(或者,新的IEnumerable')。你可以做懶惰評估;你可以緩存它,但不要枚舉它兩次。你也可以暴露一個'IQueryable'並且多次調用它。 – ErikE 2015-10-27 18:00:41