Cho một giá trị nguyên thủy age
tôi biết làm thế nào để tạo ra một biểu hiện như thế này:Tạo một biểu thức LINQ mà thông số tương đương với đối tượng
//assuming: age is an int or some other primitive type
employee => employee.Age == age
Bằng cách này:
var entityType = typeof(Employee);
var propertyName = "Age";
int age = 30;
var parameter = Expression.Parameter(entityType, "entity");
var lambda = Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, propertyName),
Expression.Constant(age)
)
, parameter);
Đó hoạt động tốt, ngoại trừ trong các kịch bản trong đó tài sản và hằng số được đề cập không phải là các kiểu nguyên thủy.
Làm cách nào để xây dựng biểu thức tương tự nếu so sánh giữa các đối tượng?
Với EF tôi chỉ có thể viết:
Location location = GetCurrentLocation();
employees = DataContext.Employees.Where(e => e.Location == location);
Đó cũng làm việc, nhưng nếu tôi cố gắng tạo ra các biểu hiện giống nhau:
var entityType = typeof(Employee);
var propertyName = "Location";
var location = GetCurrentLocation();
var parameter = Expression.Parameter(entityType, "entity");
var lambda = Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, propertyName),
Expression.Constant(location)
)
, parameter);
tôi nhận được một lỗi mà nói:
Unable to create a constant value of type 'Location'. Only primitive types or enumeration types are supported in this context.
nghi ngờ là Expression.Constant()
chỉ mong đợi các loại nguyên thủy, vì vậy tôi cần phải sử dụng một phương thức biểu hiện nhà máy khác nhau. (maype Expression.Object
? - Tôi biết điều đó không tồn tại)
Có cách nào để tạo biểu thức so sánh các đối tượng không? Tại sao EF có thể giải thích nó một cách chính xác nếu một câu lệnh LINQ được biên dịch của nó, nhưng không phải khi nó là một biểu thức?
Cũng giống như một lưu ý phụ, sử dụng Expression.Constant buộc máy chủ cơ sở dữ liệu tạo một kế hoạch thực thi SQL mới mỗi lần thay đổi liên tục. Điều này có thể có tác động hiệu suất lớn, xem https://stackoverflow.com/questions/34845097/rewriting-a-linq-expression-query-to-enable-caching-sql-execution-plan –