2013-04-25 30 views
15

Tôi đang tạo các truy vấn LINQ động cho nHibernate.Cách chuyển đổi LambdaExpression thành Biểu thức được nhập <Func<T, T>>

Do phụ thuộc, tôi muốn truyền/truy xuất biểu thức đã nhập sau đó, nhưng tôi đã không thành công cho đến nay.

Đây không phải đang làm việc (các diễn viên là vụ xảy ra ở những nơi khác):

var funcType = typeof (Func<,>).MakeGenericType(entityType, typeof (bool)); 
var typedExpression = (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

này đang làm việc:

var typedExpression = Expression.Lambda<Func<T, bool>>(itemPredicate, parameter); 

Có thể để có được những 'gói gọn' gõ biểu hiện từ một LambdaExpression ?

+0

có thể bạn đang tìm kiếm typedExpression.Compile() – jure

+1

tôi cần phải sử dụng các biểu hiện như một IQueryable với mapper ORM của tôi vì vậy nó không thể được biên dịch. – Larantz

Trả lời

24
var typedExpression = 
    (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

Đây không phải là đáng ngạc nhiên, như bạn phải Compile một LambdaExpression để có được một đại biểu thực tế mà có thể được gọi (đó là Func<T, bool> là gì).

Vì vậy, đây sẽ làm việc, nhưng tôi không chắc chắn nếu nó là những gì bạn cần:

// This is no longer an expression and cannot be used with IQueryable 
var myDelegate = 
    (Func<T, bool>) 
    Expression.Lambda(funcType, itemPredicate, parameter).Compile(); 

Nếu bạn không tìm cách để biên dịch biểu thức mà thay vào đó để di chuyển một cây biểu hiện xung quanh, sau đó là giải pháp là để thay đúc đến một Expression<Func<T, bool>>:

var typedExpression = (Expression<Func<T, bool>>) 
         Expression.Lambda(funcType, itemPredicate, parameter); 
+0

Cảm ơn bạn đã trả lời. Có, tôi đang tìm cách di chuyển cây biểu thức xung quanh. Vấn đề là diễn viên mà bạn đang tham chiếu đến 'Biểu thức > typedExpression = Expression.Lambda (funcType, itemPredicate, tham số);' Điều này dẫn đến 'Không thể chuyển đổi loại souce System.Linq.Expressions.LambdaExpression thành loại mục tiêu System.Linq.Expressions.Expression > ' – Larantz

+0

@Larantz: Xin lỗi, lỗi của tôi; Tôi quên rằng bạn cần phải đúc một cách rõ ràng. Kiểm tra câu trả lời được cập nhật. – Jon

+1

Cảm ơn bạn. Tôi không thể tin được làm sao mà tôi không nhận ra rằng tôi thiếu phần biểu thức <> của dàn diễn viên :). – Larantz