Учитывая примитивный age
ценности, я знаю, как создать такое выражение:
//assuming: age is an int or some other primitive type
employee => employee.Age == age
Делая это:
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);
Это работает отлично, за исключением сценариев, в которых свойство и константа не являются примитивными типами.
Как построить аналогичное выражение, если сравнение между объектами?
С EF я могу просто написать:
Location location = GetCurrentLocation();
employees = DataContext.Employees.Where(e => e.Location == location);
Это также работает, но если я попытаюсь создать одно и то же выражение:
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);
Я получаю сообщение об ошибке:
Unable to create a constant value of type 'Location'. Only primitive types or enumeration types are supported in this context.
Мое подозрение в том, что Expression.Constant()
только ожидает примитивных типов, поэтому мне нужно использовать другой метод фабрики выражений. (maype Expression.Object
? - Я знаю, что этого не существует)
Есть ли способ создать выражение, которое сравнивает объекты? Почему EF может правильно интерпретировать его, если его скомпилированный оператор LINQ, но не когда он является выражением?