Выполнение DynamicExpression с неизвестными типами - PullRequest
6 голосов
/ 31 декабря 2010

Если кто-то очень хорошо знаком с пространством имен 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?

1 Ответ

2 голосов
/ 31 декабря 2010

Ваше GetExpression возвращает тип Expression - метод DynamicQueryable.Where, при использовании в качестве метода расширения, ожидает строку в качестве первого параметра.

Вам нужно позвонить в Где выглядеть следующим образом:

var query = db.SysEventLogT.Where("Age > @0", 15); 

Кроме того, вы можете попробовать следующее, просто чтобы быть явным:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

Обратите внимание, что если проще, вы можете создать строчку, содержащую полный фильтр, и вообще не использовать параметр params object []:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
...