Если кто-нибудь хорошо знаком с пространством имен 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 (), чтобы это работало? Или, возможно, мне нужно создать другой. Где расширение?