Если кто-то очень хорошо знаком с пространством имен 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;
}
, представляющий простую двоичную функцию, такую как «Age> 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>
не содержит определения для 'Где', и лучшая перегрузка метода расширения
System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[])
имеет некоторые недопустимые значенияаргументы.
Я знаю, что мой экземпляр DataContext на самом деле обрабатывает таблицы sql как свойства ... мне нужно как-то отразить с помощью GetProperty (), чтобы это работало?Или, может быть, мне нужно создать другое расширение .Where?