2013-03-31 26 views
7

Tôi sẽ xem một số ví dụ LINQ từ một cuốn sách về MVC và tôi tự hỏi mục đích mà cuộc gọi chọn bên dưới có thể có. Có lẽ đó là một lỗi đánh máy nhưng tôi không thấy bất kỳ đề cập đến nó trong errata của cuốn sách.Mục đích có thể chọn của LINQ (x => x)

foreach(Product p in products 
    .Where(e => e.Name == productParam.Name) 
    .Select(e => e)) { 
     p.Price = productParam.Price; 
} 

Tôi đã kiểm tra hai ví dụ về trường hợp này .Select (e => e) đã được bao gồm và một trong đó không phải và mã giống nhau. Vì Where trả về IEnumerable được lọc bởi vị từ sau đó khi nào thì cuộc gọi chọn (với vị từ cụ thể ở trên) có cần thiết không? Nó có thực sự làm gì không? Nó có thể trong một số trường hợp góc kỳ lạ?

+0

Điều duy nhất tôi có thể nghĩ đến là nếu bạn xác định rõ ràng các đối số chung và giá trị trả lại là giá trị chuyển đổi hoàn toàn từ nguồn. Bạn cũng có thể bao gồm các điểm ngắt để sửa lỗi một cách dễ dàng (có lẽ bạn sẽ yêu cầu các dấu ngoặc nhọn và một dòng mới cho điều đó). Nhưng khác với những người (đặc biệt là kể từ khi không phải là _actually happening_ trong mã bạn đăng), tôi không thể nghĩ ra bất kỳ mục đích đáng giá cho nó. Có lẽ một chuyển đổi lười biếng từ cú pháp truy vấn LINQ? –

+0

Đây thực sự là một sai lầm phổ biến. Thậm chí phổ biến hơn là tát ToList trên mọi thứ. Mọi người thường không hiểu đầy đủ về mô hình thực hiện của các truy vấn LINQ (có thể hiểu được). – usr

+0

@usr Tôi muốn có một phần mở rộng 'Force' (tiêu chuẩn) mặc dù .. có nhiều lần khi một đánh giá của một IQuerable/IEnumerable phải được buộc, ngay cả khi bạn không * thực sự * quan tâm đến một danh sách. Tên cũng sẽ làm cho nó rõ ràng hơn như các hoạt động mong muốn. –

Trả lời

9

Nó sẽ trả lại cùng một điều chính xác như không có nó, một IEnumerable<T>. Đó là atually làm hại nhiều hơn tốt mặc dù nó thực hiện một hoạt động O (n) dư thừa (looping thông qua toàn bộ danh sách).

Tài liệu tham khảo

+1

Không chính xác - nó sẽ trả về IQueryable . Nhưng nếu không bạn là chính xác, bạn sẽ có được điều tương tự như không có biểu thức Chọn. – chris

+1

Dựa trên định nghĩa trên trang tham chiếu Enumerable.Select là "Dự án mỗi phần tử của một chuỗi thành một biểu mẫu mới." và thực tế rằng phép chiếu là cùng một hình thức, điều này dường như chứng minh rằng nó không phục vụ mục đích ở đây. – seangwright

+0

@DanielImms nếu sản phẩm là một 'IQueryable' cuộc gọi chọn sẽ kết thúc dưới dạng O (1) trên hầu hết các nhà cung cấp bởi vì nó không có gì. <- Đây chỉ là nitpicking. Câu trả lời của bạn tốt và tôi đã bình chọn nó. – usr

5

Liệu nó thực sự làm bất cứ điều gì?

Nó thêm chi phí cho toàn bộ hoạt động. Trong thực tế, nó nên được loại bỏ, vì nó không phục vụ mục đích hữu ích.

3

Tôi nghĩ tác giả chỉ muốn hiển thị cách truy vấn LINQ rất giống với câu lệnh SQL. Trong trường hợp này, rõ ràng là không cần thiết vì nó sử dụng chức năng nhận dạng và có thể bị bỏ qua. Tuy nhiên, yêu cầu phải có mệnh đề select trong SQL. Nó không sai khi có nó ở đó, nhưng nó chắc chắn không cần thiết.

Mặc dù nói chung, có một cuộc gọi chọn nhận dạng không phải lúc nào cũng là điều xấu, đặc biệt nếu truy vấn đang được trả về trong một hàm. Điều này có thể giúp cung cấp cho bạn chế độ xem chỉ đọc của bộ sưu tập bạn muốn trả lại. Nhưng điều này không áp dụng trong trường hợp này khi truy vấn đang được liệt kê ngay lập tức.

Các vấn đề liên quan