Выполнение DynamicExpression с неизвестными типами

Если кто-нибудь хорошо знаком с пространством имен Linq.Dynamic, мне бы пригодилась помощь - я не смог найти никаких дополнительных ресурсов в Интернете.

В основном, Я использую 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).

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>

не содержит определения для 'Where', а перегрузка лучшего метода расширения

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 

имеет некоторые недопустимые аргументы.

Я знаю, что мой экземпляр DataContext на самом деле обрабатывает таблицы sql как свойства ... нужно ли мне каким-то образом размышлять с помощью GetProperty (), чтобы это работало? Или, возможно, мне нужно создать другой. Где расширение?

6
задан sean 31 December 2010 в 05:45
поделиться