C# Деревья выражений - объединение нескольких вызовов методов - PullRequest
0 голосов
/ 24 марта 2020

Я использую. Net Ядра и деревья выражений.

У меня есть класс Product, где свойство LstProp содержит список значений, разделенных ';', например, "val1; val2; val3;" :

public class Product
{
  // actually contains list of values separated by ';'
  public string LstProp{get; set;}
}

И я хочу фильтровать Продукты по этому свойству и содержит любые условия, используя деревья выражений. Я пробовал это, но это не работает.

 var value="val1;val2"
 var productItem = Expression.Parameter(typeof(Product), "product");
 var prop = Expression.Property(productItem, "LstProp");

 MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
 var values = value.ToString().Split(';');
 Expression predicate = null;
 foreach (var val in values)
 {
    var listPropExpression = Expression.Constant(val);
    var containsExpresion=Expression.Call(listPropExpression, method, property);
    predicate = predicate != null ? Expression.Or(predicate, containsExpresion) : containsExpresion;
 }

Поэтому я пытаюсь объединить вызов функции Contains для каждого значения в списке, но получаю сообщение об ошибке «Нет преобразования между BinaryExpression и MethodCallExpression ".

Как можно объединить несколько вызовов методов с деревьями выражений?

1 Ответ

0 голосов
/ 24 марта 2020

Я нашел решение. У меня две проблемы:

  1. Неправильный порядок параметров. Должно быть Expression.Call(property, method, listPropExpression); вместо Expression.Call(listPropExpression, method, property);

  2. Основная проблема была решена с помощью простого приведения:

    предикат = предикат! = Ноль? (Выражение) Expression.Or (предикат, containsExpresion): containsExpresion;

В результате я получаю выражение типа product=>product.LstProp.Contains("val1") Or product.LstProp.Contains("val2")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...