2010-06-29 44 views
38

MSDN tiểu bang tài liệu:Mục đích của phương thức Expression.Quote của LINQ là gì?

Expression.Quote

Phương pháp Tạo một UnaryExpression đại diện cho một biểu mà có một giá trị không đổi loại Expression.

Tôi đã có thể xây dựng các biểu thức vị ngữ để sử dụng trong truy vấn LINQ bằng cách xây dựng thủ công chúng bằng cách sử dụng lớp Expression, nhưng chưa bao giờ gặp nhu cầu Expression.Quote.

Khi nào và tại sao bạn nên sử dụng tính năng này? Từ các biểu thức LINQ tôi đã thấy có chúng, chúng dường như chỉ bao bọc các biểu thức hiện tại mà không thêm bất kỳ giá trị nào.

Mục đích của phương thức Trích dẫn/loại nút là gì?

+0

"Khi bạn đang xây dựng MethodCallExpression bằng Expression.Call, bất kỳ tham số nào là biểu thức lambda (LambdaExpression/Expression ) phải sử dụng Expression.Quote để bọc tham số trước khi chuyển vào." Điều đó có đúng không? Sử dụng .Net 4.5, tôi có thể vượt qua thành công biểu thức trần > mà không cần phải báo giá chúng với Expression.Quote(). –

+0

Nếu tham số của bạn thuộc loại 'Func <>', thì chắc chắn đó là tất cả những gì bạn cần, nhưng trong trường hợp của nhiều phương thức mở rộng LINQ 'IQueryable ', kiểu tham số thực sự là 'Expression >', và trong trường hợp đó bạn sẽ cần 'Expression.Quote'. Tôi đã không cố gắng làm điều này với. NET 4.5, nhưng tôi muốn giả định nó là như nhau. Tại thời điểm viết, tôi có thể sử dụng .NET 3.5. – GiddyUpHorsey

Trả lời

23

Expression.Quote chỉ định rằng lambda được coi là cây biểu thức chứ không phải là hàm. Nó gây ra ngữ nghĩa đóng cửa trên toán hạng của nó.

Khi bạn đang xây dựng một MethodCallExpression sử dụng Expression.Call, bất kỳ thông số đó là các biểu thức lambda (LambdaExpression/Expression<TDelegate>) phải sử dụng Expression.Quote để bọc các thông số trước khi đi qua trong.

Vì vậy, đối với một số loại Expression<Func<bool>>, khi bạn tạo một ví dụ như: () => true, tài sản Type của biểu thức như sau Func<bool> trong khi kiểu của biểu thức (gọi GetType) sẽ là Expression<Func<bool>>

vì vậy, để có được một Expression có giá trị chính xác cho thuộc tính Type bạn chuyển biểu thức lambda vào Expression.Quote và chuyển giá trị đó làm tham số cho Expression.Call.

Tôi đã xem Expression.Quote thông qua phản xạ và trong khi tham số duy nhất là loại Expression, nó phải lấy được từ LambdaExpression và điều này được chọn bên trong phương thức. Không quan tâm, có ai biết tại sao MS không chỉ tạo kiểu tham số là LambdaExpression?

Như StevenH đã chỉ ra, Expression.Quote được sử dụng trong việc triển khai Nhà cung cấp truy vấn LINQ. Tất cả các phương thức trên Queryable có biểu thức lambda chẳng hạn như Where, OrderBy, GroupBy, v.v ... trong nội bộ xây dựng một MethodCallExpression sử dụng Expression.Call và bọc tham số biểu thức lambda với các cuộc gọi Expression.Quote.

Để được giải thích chi tiết hơn về Expression.Quote, hãy đọc số answer này.

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