Использование лямбда-выражения из дочернего класса - PullRequest
0 голосов
/ 20 сентября 2018

У меня следующая ситуация:

public class BaseClass
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }    
}

public class Product: BaseClass
{
/* Some methods*/
}

public class Country: BaseClass
{
/* Some methods*/
}

public class MyCustomClass
{
public Product Product { get; set; }
public Country Country { get; set; }    
}

Я хочу создать список выражений, которые я позже использовал бы для запроса моего MyCustomClass, например

var listOfExpressions= new List<Expression<Func<MyCustomClass, bool>>>();

if (x == 1)
    listOfExpressions.Add(x => x.Product.Field1 == "Fruit")
/*.
  .
  .*/
if (y == 2)
    listOfExpressions.Add(x => x.Country.Field2 == "Western")
} 

Теперь это выглядитдействительно ужасно с этой связкой Ifs, и я предпочел бы иметь метод в BaseClass, для которого вы передадите int ({1,2,3}), и он вернет мне выражение.Проблема в том, что мне нужно иметь выражение типа <MyCustomClass, bool>, но в моем BaseClass я не могу получить это напрямую, есть ли способ, которым я мог бы добиться этого, не усложняя код слишком много?

Ядумая о чем-то вроде этого:

public class BaseClass
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }    

protected Expression<Func<BaseClass, bool>> GetExpression(int key, string value)
{
        switch (key)
        {
            case 1:
                return x => x.Field1 == value;
            case 2:
                return x => x.Field2 == value;
            case 3:
                return x => x.Field3 == value;
        }
}

Теперь я застрял в том, как получить Expression<Func<BaseClass, bool>> для использования в Expression<Func<MyCustomClass, bool>>.

РЕДАКТИРОВАТЬ: Цель выражения:

Я хочу составить список выражений, чтобы позже использовать его для запросов к базе данных с использованием ядра Entity Framework.Пример:

    var query = DbContext.MyCustomClass.AsQueryable();

    foreach (var expression in listOfExpressions)
    {
        query = query.Where(expression);
    }

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете создать свое выражение самостоятельно.Просто добавьте еще один параметр к GetExpression:

public static Expression<Func<MyCustomClass, bool>> GetExpression(
    string derrivedName, // "Product" or "Country"
    int fieldId,
    string value)
{
    var x = Expression.Parameter(typeof(MyCustomClass), "x");
    var lambda = Expression.Lambda<Func<MyCustomClass, bool>>(
        Expression.Equal(
            Expression.Constant(value),
            Expression.PropertyOrField(
                Expression.PropertyOrField(x, derrivedName),
                $"Field{fieldId}")
            ), 
            x);

    return lambda;
}

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

var exp3 = GetExpression("Product", 1, "Fruit");

Эта строка создаст выражение x => ("Fruit" == x.Product.Field1)

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