Я попытался сделать это ниже, с пробелами, потому что это усложнилось.
Мне нужно создать предикат для передачи в мой репозиторий продуктов из строки клиента:
"fieldname .startsWith. 'fieldvalue'"
"fieldname .contains. 'fieldvalue'"
"fieldname .equals. 3"
"fieldname .greaterThan. 3"
"fieldname .lessThan. 3"
Имена полей могут быть любыми существующими полями в сущности.Там есть работа, чтобы соответствовать им точно.Есть только числа и строки, и только перечисленные команды.
Код на данный момент (дикий колебание):
// p => p.L == R
// L is the left side (the field to examine)
// R is the right side (the value to compare to)
// O is the operator (Equal)
var fieldParm = Expression.Parameter(typeof(Entity), typeof(Entity).Name);
var compareL1 = MemberExpression.Property(fieldParm, "fieldName"); // fieldname
var compareR1 = Expression.Constant("fieldValue"); // what field should equal
var compareO1 = MemberExpression.Equal(compareWhat, compareTo);
// Do it again for each one (probably should make a foreach out of this)
var compareL2 = MemberExpression.Property(fieldParm, "fieldName"); // fieldname
var compareR2 = Expression.Constant("fieldValue"); // what field should equal
var compareO2 = MemberExpression.Equal(compareWhat, compareTo);
// Put them all together
var myExpress = Expression.And(compareO1, compareO2) // And them together
// Create predicate
Expression<Func<Entity, bool>> resultLambda =
Expression.Lambda<Func<Entity, bool>>( myExpress,
new ParameterExpression[] { fieldParm });
И resultLambda должен содержать наш предикат для передачи нашему .Where ()
Как бы вы сделали это для ряда условий AND, как указано выше?