2011-11-15 32 views
8

Hôm nay tôi gặp sự cố với LINQ đối tượng (không phải SQL) xuất hiện do lỗi đánh máy. Tôi có một số .Select và một số .Where ở một nơi khác. Tôi đã mong đợi kết quả tương tự nhưng họ đang hiển thị các con số khác nhau. Giả somelist có 10 yếu tố với tất cả các yếu tố có qty = 0LINQ mơ hồ về nơi và chọn

//returns 10 - basically count of all rows. I am expecting 0 
somelist.Select(p => p.qty > 0).Count() 

//returns 0 - the correct count 
somelist.Where(p => p.qty > 0).Count() 

nếu cả hai lựa chọn và nơi trở IEnumerable<T> thì tại sao sự mơ hồ? Cảm ơn bạn.

+0

thx mọi người cho bản cập nhật LINQ 101 đó. – Gullu

+0

Đó là một trong những vấn đề đặt tên thú vị, C# đang cố gắng để có cú pháp như sql (sql gợi ý bạn chọn cột), nhưng tên 'Select', đặc biệt nếu bạn đặt vào vị từ, có thể đọc như bạn chỉ chọn các mục vượt qua, infact trong ruby ​​và smalltalk đó là phương thức 'select'. – jbtule

Trả lời

18

Select là một phép chiếu, vì vậy những gì bạn nhận được là biểu thức p.qty > 0 được đánh giá cho từng phần tử trong somelist. nghĩa là rất nhiều giá trị đúng/sai (cùng số với danh sách gốc của bạn). Vì vậy, khi bạn thực hiện Count trên đó, bạn sẽ nhận được cùng một số. Nếu bạn nhìn vào lựa chọn sẽ trả lại IEnumerable<bool> (vì loại p.qty > 0 là một bool).

Where lọc kết quả để tính số lần chạy trên danh sách được lọc và cung cấp cho bạn kết quả mong đợi. Loại này là IEnumerable<TypeOfElementInOriginalList>.

Lưu ý bạn cũng có thể thực hiện: somelist.Count(p => p.qty > 0) vì Số có một số overload chấp nhận vị từ để lọc theo.

2

Truy vấn đầu tiên cho giống như somelist.Count(). Nó chỉ là số lượng các phần tử trong chuỗi. Cuộc gọi đến Selectdự án mỗi đối tượng, nhưng số đối tượng vẫn giữ nguyên.

Truy vấn thứ hai cung cấp số lượng phần tử đáp ứng biến vị ngữ, là số có khả năng thấp hơn. Cuộc gọi tới Wherebộ lọc đối tượng từ chuỗi.

0

Truy vấn đầu tiên trả về IEnumerable của booleans.

Truy vấn thứ hai chỉ trả về các phần tử trong bản gốc khớp với biểu thức boolean.

0

Câu lệnh đầu tiên tạo một số IEnumerable của bool: là trường qty> 0. Vì có 10 bản ghi, bạn nhận được 10 bool.

Thứ hai trả về một IEnumerable được lọc qua điều kiện.