2013-02-01 25 views
8

Tôi có một hàm để tạo biểu thức được sử dụng trong mệnh đề where LINQ.Biểu thức <Func<T,bool>> thêm một Chuyển đổi không mong muốn khi được tạo theo phương pháp chung

public static Expression<Func<T,bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 

(lưu ý IActive chỉ xác định các bất động sản 'Hoạt động')

Có chức năng khác có liên quan và ý tưởng là tôi có thể tiêm các điều kiện cần thiết vào một lớp Generic để kiểm soát quy tắc kinh doanh vv

vấn đề là khi tôi chạy này, Expression trở chứa lamda (nhìn từ phía debugger):

x => Convert(x).Active 

đó là tất nhiên rej bởi linq: 'LINQ to Entities chỉ hỗ trợ truyền các kiểu nguyên thủy của Mô hình thực thể.'

Câu hỏi của tôi là ...

Làm cách nào để ngăn chặn hành vi này. Không cần chuyển đổi và rõ ràng là không thể xóa được. Thậm chí có thể ngăn chặn điều này không?

Trả lời

10

Vâng, giả sử này chỉ cần làm việc với các lớp (chuyển đổi dành cho đấm bốc giá trị các loại), bạn có thể thêm một hạn chế class:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : class, IActive 
{ 
    return x => x.Active; 
} 

. ..và chuyển đổi biến mất.

+2

ah, thú vị; sự khác biệt cơ bản có sự thay đổi giữa "ràng buộc" thành "callvirt"; điều thú vị là điều này cho phép nó hoạt động –

2

Hãy thử điều này:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 
+0

Tôi nghi ngờ đó là lỗi bản sao trong câu hỏi –

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