2011-09-17 21 views
11

Tôi có một QueryOver đơn giảnđơn giản QueryOver: Không nhận ra phương pháp gọi

var q = SessionInstance.QueryOver<Person>().Where(p => p.Number.Equals(number)); 

kiểu trường Số là int. truy vấn này có một lỗi runtime bằng tin nhắn này:

Không nhận dạng được gọi phương thức: System.Int32: Equals Boolean (Int32)

+1

bạn có thể gửi các bản đồ của 'Person'? bạn cũng có thể thử '.Where (p => p.Number == number' số –

+0

Cảm ơn! Vấn đề được giải quyết bằng cách thay thế '==' leiu bằng. Khác nhau giữa '==' và 'Equals' trong trường bằng int type là gì ? – Ehsan

Trả lời

27

Nhà điều hành == tạo ra một BinaryExpression mà có thể được chuyển đổi sang SQL và Phương pháp .Equals() tạo ra một MethodCallExpression mà dường như là không phải là được chuyển đổi thành SQL.

Thông thường các toán tử nhị phân được xử lý trong QueryOver và cũng trong LINQ nhưng chỉ có một vài cuộc gọi phương thức được xử lý (string.Contains, array.Contains, v.v.) để bạn sử dụng toán tử tốt hơn khi có thể. Cũng cần nhớ rằng các toán tử/các lời gọi phương thức không thực sự được thực thi, nhưng các câu lệnh SQL được chuyển đổi sao cho nếu bạn có các ghi đè/triển khai tùy chỉnh cho chúng, chúng có thể không hoạt động như mong muốn.

Với trên mã của bạn sẽ được viết lại như sau:

var q = SessionInstance.QueryOver<Person>().Where(p => p.Number == number); 
+0

Điều đó đã lưu một vài công việc ở đây. Cảm ơn – SadullahCeran

+0

Giải thích tuyệt vời, cảm ơn bạn! –