Tôi đang sử dụng câu lệnh dưới đây với mục đích nhận tất cả các đối tượng máy từ bộ sưu tập MachineList
(loại IEnumerable) có MachineStatus
của i. Bộ sưu tập MachineList
sẽ không luôn luôn chứa các máy có trạng thái là i.Trả lại bộ sưu tập trống khi LINQ không trả lại gì cả
Đôi khi không có máy nào có MachineStatus
của i Tôi muốn trả lại bộ sưu tập trống. Cuộc gọi của tôi tới ActiveMachines
(được sử dụng trước) hoạt động nhưng InactiveMachines
thì không.
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");
}
}
Sửa
Sau khi kiểm tra kỹ hơn có vẻ như bất cứ đếm MachineList
sẽ gây enumerations tiếp theo của MachineList
để ném một exeception: Object reference not set to an instance of an object
.
Do đó, việc gọi đến ActiveMachines
hoặc InactiveMachines
là vấn đề với bộ sưu tập MachineList
không quan trọng. Điều này đặc biệt khó khăn vì tôi có thể ngắt cuộc gọi đến MachineList
chỉ đơn giản bằng cách liệt kê nó trong một chiếc đồng hồ trước khi nó được gọi trong mã. Ở mức thấp nhất MachineList
thực hiện NHibernate.IQuery
được trả lại dưới dạng IEnumerable
. Điều gì gây ra MachineList
để mất nội dung của nó sau một điều tra ban đầu?
Không, không có gì đặc biệt xảy ra ở điều tra; nó sẽ là thú vị để xem những gì "không hoạt động" vv là trong trình gỡ lỗi. Tôi cũng tự hỏi liệu (ví dụ) 'MachineStatus' là một thuộc tính mặt tiền đang ném một ngoại lệ - tức là' chuỗi công khai MachineStatus {get {return someInnerField.Status;}} 'và' someInnerField' là 'null'. –
Vấn đề thực sự là bạn liệt kê một 'IEnumerable' nhiều lần. Hợp đồng ngầm mà bạn đồng ý khi bạn tiêu thụ một 'IEnumerable' là liệt kê nó chỉ một lần! Vì vậy, câu trả lời thực sự không dành cho đồng nghiệp của bạn thay đổi mã của mình để cho phép nhiều liệt kê, nhưng để bạn thực hiện 'Customer.MachineList.ToList()' tại một số điểm và sau đó chỉ sử dụng danh sách kết quả sau đó (hoặc, nhận mới 'IEnumerable' một lần nữa). Bạn có thể làm đánh giá lười biếng; bạn có thể cache nó, nhưng không liệt kê nó hai lần. Bạn cũng có thể hiển thị 'IQueryable' và gọi nó nhiều lần. – ErikE