У меня следующая ситуация:
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);
}