Получить результирующее выражение LINQ из LINQ Dynamic WHERE

У меня есть следующий код в LINQ Dynamic:

var list = server1Products.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2).ToList();

Мне нужно получить результирующее выражение LINQ после использования LINQ Dynamic WHERE, поэтому используйте его в другом списке.

Как получить результирующее выражение LINQ?

.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2)

Пример:

// get the LINQ expression from WHERE
var conditions = GetExpresionFromWhere(list); // HOW TO DO?
//
// apply the same filter expression on another list
var result2 = list2.Where(conditions);

Большое спасибо!


person JaimeCamargo    schedule 07.06.2016    source источник
comment
Переменная list — это всего лишь экземпляр List<T>, как и любой другой, от него ничего нельзя получить.   -  person Ivan Stoev    schedule 07.06.2016
comment
Идеально @IvanStoev!... Помните, что это пример, объясняющий необходимость. Мне нужно получить выражение LINQ из WHERE. Переменная предназначена только для иллюстрации.   -  person JaimeCamargo    schedule 07.06.2016


Ответы (2)


По сути, DynamicLinq здесь выполняет синтаксический анализ string, который вы передаете (вместе с аргументами), в Expression<Func<T, bool>>.

Итак, чтобы желаемое Expression<Func<T, bool>> хранилось в переменной, вы можете сделать это:

var conditions = DynamicExpression.ParseLambda<ENTITY, bool>("Field1 = @0 AND Field2 >= @1", arg1, arg2);

(где ENTITY — тип вашей сущности)

Затем используйте его:

var result2 = list2.Where(conditions);

Кроме того, если list2 больше не IQueryable<ENTITY>, а IEnumerable<ENTITY>, вам придется скомпилировать Expression в Func<ENTITY, bool> следующим образом:

var result2 = list2.Where(conditions.Compile());

См. Источник

person haim770    schedule 07.06.2016

Хотя маловероятно, что вы сможете разрешить выражение, которое использовалось в списке после того, как оно уже было выполнено, вы можете рассмотреть возможность сохранения выражения и его использования в нескольких местах:

Expression<Func<ServerProductClass, bool>> conditions = BuildWhereExpression();

Где ваш метод BuildWhereExpression() выглядел примерно так и генерировал необходимое выражение:

public Expression<Func<ServerProductClass, bool>> BuildExpression(string predicate, object[] terms)
{
     return DynamicExpression.ParseLambda<ServerProductClass, bool>(predicate, terms);
}

Таким образом, весь ваш код может выглядеть примерно так:

// Build your condition
var condition = BuildExpression("Field1 = @0 AND Field2 >= @2", new object[]{arg1, arg2 });

// Filter your initial list
list = list.Where(condition).ToList();

// Use it again later
var list2 = someOtherList.Where(condition).ToList();
person Rion Williams    schedule 07.06.2016