Dato un valore di base age
Io so come creare un'espressione come questa:Creazione di un'espressione LINQ in cui il parametro è uguale oggetto
//assuming: age is an int or some other primitive type
employee => employee.Age == age
In questo modo:
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);
Questo funziona bene tranne che in scenari dove la proprietà e la costante in questione non sono tipi primitivi.
Come dovrei costruire una simile espressione se il confronto è tra gli oggetti?
Con EF posso solo scrivere:
Location location = GetCurrentLocation();
employees = DataContext.Employees.Where(e => e.Location == location);
che funziona anche, ma se cerco di creare la stessa espressione:
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);
ottengo un errore che dice:
Unable to create a constant value of type 'Location'. Only primitive types or enumeration types are supported in this context.
My sospetto è che Expression.Constant()
aspetta solo tipi primitivi, quindi ho bisogno di utilizzare un diverso metodo di espressione di fabbrica. (maype Expression.Object
? - So che non esiste)
C'è un modo per creare un'espressione che mette a confronto gli oggetti? Perchè è che EF è in grado di interpretare correttamente se un compilato dichiarazione LINQ, ma non quando è espressione?
Proprio come una nota a margine, l'uso di Expression.Constant impone al server di database di generare un nuovo piano di esecuzione SQL ogni volta che la costante cambia. Questo può avere un grande impatto sulle prestazioni, vedere https://stackoverflow.com/questions/34845097/rewriting-a-linq-expression-query-to-enable-caching-sql-execution-plan –