Sto tentando di creare una query dinamica con alberi di espressione per abbinare la seguente dichiarazione:Utilizzando il metodo Seleziona per query dinamiche e gli alberi di espressione
var items = data.Where(i => i.CoverageType == 2).Select(i => i.LimitSelected);
posso creare il metodo in cui e ottenere un risultato da esso; tuttavia, non riesco a creare il metodo di selezione.
Ecco il mio metodo in cui:
var parm = Expression.Parameter(typeof(BaseClassData), "baseCoverage");
var queryData = data.AsQueryable();
var left = Expression.Property(parm, "CoverageType");
var right = Expression.Constant(2m);
var e1 = Expression.Equal(left, right);
var whereMethod = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryData.ElementType },
queryData.Expression,
Expression.Lambda<Func<BaseClassData, bool>>(e1, new ParameterExpression[] { parm }));
Questo è quello che sto usando per il metodo di selezione:
var selectParm = Expression.Property(parm, "LimitSelected");
var selectMethod = Expression.Call(
typeof(Enumerable),
"Select",
new Type[]{typeof(BaseClassData), typeof(decimal)},
whereMethod,
Expression.Lambda<Func<BaseClassData, decimal>>(selectParm, new ParameterExpression[]{ parm})
);
Quando eseguo il codice ottengo questo errore:
No generic method 'Select' on type 'System.Linq.Enumerable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
Ho anche provato a modificare Enumerable su Queryable e ottengo lo stesso errore.
'Seleziona' e' Dove' prendere ** due ** parametri generici. – SLaks
Intendi nell'array ParameterExpression? Te lo chiedo perché la dichiarazione era valida come codificata. Se creo solo la query utilizzando il metodo where, tutto funziona correttamente. È quando tento di aggiungere il metodo select all'albero delle espressioni. – MarkSalow
Ho aggiunto typeof (BaseClassData) all'array di tipi di selectMethod e funziona. – MarkSalow