2009-11-30 28 views
6

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?

+0

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'. –

+0

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

Trả lời

7

Where trả về một chuỗi trống nếu không có kết quả phù hợp; đây là một chuỗi hoàn toàn hợp lệ (không phải là null). Cách duy nhất bạn nhận được một null là nếu bạn gọi FirstOrDefault hoặc SingleOrDefault.

Bạn có chắc chắn là lỗi mà bạn nghĩ là nó không?

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 
+0

Đó là những gì tôi nghĩ. Tôi đã sửa đổi câu hỏi của tôi để phản ánh một sửa đổi mà ném cùng một lỗi. – ahsteele

+0

Đã thêm một số thông tin bổ sung cho câu hỏi của tôi có thể làm sáng tỏ những gì đang diễn ra. Điều đó nói rằng, tôi nghĩ rằng tôi có thể có liên quan đến việc cần phải mở một chủ đề mới. – ahsteele

+0

Lỗi phải làm với cách mà MachineList đang được xây dựng. Tôi đã sử dụng phương pháp này từ một nhà phát triển khác và đã không kiểm tra cách nó được xây dựng. Cảm ơn bạn đã chỉ cho tôi đúng hướng bằng cách hỏi tôi có chắc là tôi đang tìm đúng chỗ không. – ahsteele

4

Theo mặc định, Enumerable.Where đã trả lại số trống IEnumerable<T>, không null. Nếu bạn đang nhìn thấy "tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng." ngoại lệ, rất có thể là một vấn đề khác.

Có phải danh sách MachineList không? Nếu bạn đã không tạo ra nó, bạn sẽ nhận được ngoại lệ mà theo yêu cầu của bạn để .Where(...)

+0

Cảm ơn bạn đã chỉ cho tôi đúng hướng bằng cách hỏi tôi có chắc là tôi đang tìm đúng chỗ không. – ahsteele

2

Ngoài ra, nếu bạn muốn quay trở lại một cách rõ ràng một bộ sưu tập sản phẩm nào, điều này có thể giúp ...

Enumerable.Empty<Machine>(); 
Các vấn đề liên quan