Выполнение 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");