Ja próbuje utworzyć dynamiczną kwerendę za pomocą wyrażenia drzew, aby dopasować następujące oświadczenie:Używanie Wybierz metodę dynamicznych zapytań i drzew ekspresyjnych
var items = data.Where(i => i.CoverageType == 2).Select(i => i.LimitSelected);
mogę utworzyć gdzie metody i uzyskać wynik od niego; jednak nie mogę utworzyć wybranej metody.
Oto mój gdzie metoda:
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 }));
To co używam do wyboru metody:
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})
);
Kiedy uruchomić kod otrzymuję ten błąd:
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.
Próbowałem również zmienić Enumerable na Queryable i otrzymuję ten sam błąd.
'Wybierz' i' Gdzie' bierze ** dwa ** ogólne parametry. – SLaks
Masz na myśli tablicę ParameterExpression? Pytam, ponieważ oświadczenie było w porządku, tak jak zakodowane. Jeśli utworzę zapytanie tylko za pomocą metody where, wszystko działa poprawnie. Jest to próba dodania wybranej metody do drzewa wyrażeń. – MarkSalow
Dodałem typeof (BaseClassData) do tablicy typów selectMethod i to działa. – MarkSalow