YourGeneric должен быть типом объекта, который вы хотите запросить. Например, если в вашем DbContext у вас есть коллекция городов (DbSet Cities), вы должны передать этот тип в качестве универсального типа.
Вы не хотите писать собственный код для каждого типа объекта в вашем контексте. Код, который вы пишете, должен работать как для запроса таблицы Cities, так и для запроса таблицы Fruits. Отсюда - использование дженериков.
Как пример:
ParameterExpression pe = Expression.Parameter(typeof(City), "x");
Создает выражение для лямбда-параметра типа City, который можно использовать для запроса коллекции этого типа. Чтобы сделать код многоразовым, вы можете сделать его универсальным (как указано в вашем вопросе) и что-то вроде этого:
public Expression CreateExpression<TEntity, TConst>(WhereClause singleWhere)
{
Type entityType = typeof(TEntity);
ParameterExpression pe = Expression.Parameter(entityType, "x");
Expression left = Expression.Property(pe,
entityType.GetProperty(singleWhere.ColumnName));
Expression right = Expression.Constant(singleWhere.Value, typeof(TConst));
return getOperatorExp(singleWhere.Operator, left, right);
}
Затем вы можете передавать соответствующие типы в своих вызовах, например так:
Expression result = CreateExpression<City, int>();
Это позволяет вам передавать разные типы сущностей и разные типы констант для запроса при каждом вызове.
Кроме того, это, вероятно, должен быть верхний регистр:
case "Equals":
Было бы хорошо, если бы ваш пример кода был компилируемым до некоторой степени - мне было бы легче дать вам рабочий пример. Деревья выражений в .NET - гораздо более сложная тема, чем обобщенные.