2010-12-31 17 views
6

Nếu có ai đó rất quen thuộc với không gian tên Linq.Dynamic, tôi có thể sử dụng một số trợ giúp - không thể tìm thấy bất kỳ tài nguyên độc lập nào trên internet.Thực thi DynamicExpression với các loại không xác định

Về cơ bản tôi đang sử dụng DynamicExpression.ParseLambda để tạo ra một biểu thức mà loại không biết đến lúc biên dịch,

public Expression GetExpression(Type t, List<QueryFilter> filters) 
{ 
    // pseudo code 
    // extracts a string representation of the query as 'expressionString' 

    return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values); 
} 

Trường hợp QueryFilter là:

public class QueryFilter 
{ 
    string propertyName; 
    ExpressionType operationType; 
    object value; 
} 

nào đại diện cho một nhị phân đơn giản chức năng như "Tuổi> 15" hoặc một cái gì đó.

Đây là cách chức năng 'GetExpression' hoạt động, cần 2 loại - một loại là kiểu đầu vào và loại đầu ra, và cuối cùng tạo ra những gì thường được tạo bằng đại biểu Func. Nó cũng lấy một chuỗi đại diện cho truy vấn và một đối tượng param [] của các giá trị, là 'expressionString' và 'values' ở trên, tương ứng.

Tuy nhiên, tôi gặp sự cố khi thực thi biểu thức động trong LINQ-to-SQL, sử dụng DataContext được tạo từ tệp SqlMetal (.dbmc).

DatabaseContext db = new DatabaseContext(connectionString); 

var filter = DynamicExpressionBuilder. 
     GetExpression(typeof(SysEventLogT), sysEventFilters) 

var query = db.SysEventLogT.Where(filter); 

Tạo các lỗi sau,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT> 

không chứa một định nghĩa cho 'ở đâu' và phần mở rộng phương pháp quá tải tốt nhất

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 

có một số đối số không hợp lệ.

Tôi biết rằng trường hợp DataContext của tôi thực sự xử lý các bảng sql là thuộc tính ... tôi có cần phản ánh với GetProperty() bằng cách nào đó để làm việc này không? Hoặc có lẽ tôi cần phải tạo một phần mở rộng khác.

Trả lời

2

GetExpression của bạn đang trả về loại Biểu thức - phương thức DynamicQueryable.Where, khi được sử dụng làm phương thức tiện ích, dự kiến ​​chuỗi là thông số đầu tiên.

Bạn cần cuộc gọi của bạn đến đâu trông như thế này:

var query = db.SysEventLogT.Where("Age > @0", 15); 

Ngoài ra, bạn có thể thử những điều sau đây, chỉ để được rõ ràng:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

Lưu ý rằng nếu dễ dàng hơn, bạn có thể xây dựng sting chứa bộ lọc đầy đủ và không sử dụng tham số đối tượng param [] ở tất cả:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15");