Выполнение DynamicExpression с неизвестными типами
если кто-то очень знаком с Linq.Динамическое пространство имен я мог бы использовать некоторую помощь-не могу найти глубинные ресурсы в интернете.
в основном я использую DynamicExpression.ParseLambda для создания выражения, где тип не известен во время компиляции,
public Expression GetExpression(Type t, List<QueryFilter> filters)
{
// pseudo code
// extracts a string representation of the query as 'expressionString'
return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values);
}
где QueryFilter является:
public class QueryFilter
{
string propertyName;
ExpressionType operationType;
object value;
}
который представляет собой простую двоичную функцию, такую как" возраст > 15 " или что-то в этом роде.
так работает функция GetExpression, он принимает 2 типа - один, который является типом ввода, и один, который является типом вывода, и в конечном итоге генерирует то, что обычно создается с помощью делегата Func. Он также принимает строку, представляющую запрос и объект params [] значений, которые являются "expressionString" и "values" выше, соответственно.
однако у меня возникли проблемы с выполнением динамического выражения в LINQ-to-SQL, используя DataContext, сгенерированный из SqlMetal (.dbmc file).
DatabaseContext db = new DatabaseContext(connectionString);
var filter = DynamicExpressionBuilder.
GetExpression(typeof(SysEventLogT), sysEventFilters)
var query = db.SysEventLogT.Where(filter);
производит следующая ошибка,
System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>
не содержит определения для "Где" и лучшей перегрузки метода расширения
System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[])
имеет некоторые недопустимые аргументы.
Я знаю, что мой экземпляр DataContext фактически обрабатывает таблицы sql как свойства...мне нужно как-то отразить с GetProperty (), чтобы это сработало? Или, возможно, мне нужно создать другую .Где продолжение?
1 ответов
ваше GetExpression возвращает тип выражения-DynamicQueryable.Где метод, при использовании в качестве метода расширения, ожидает строку в качестве первого параметра.
тебе нужно позвонить туда, где выглядеть так:
var query = db.SysEventLogT.Where("Age > @0", 15);
кроме того, вы можете попробовать следующее, Просто чтобы быть явным:
var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15);
обратите внимание, что если проще, вы можете создать sting, содержащий полный фильтр и не использовать параметр params object[] вообще:
var query = db.SysEventLogT.AsQueryable().Where("Age > 15");