Превратить "fieldname .startsWith. 'FieldValue'" в предикат .Where (p => p.fieldname.StartsWith ('fieldValue'))? - PullRequest
1 голос
/ 01 ноября 2010

Я попытался сделать это ниже, с пробелами, потому что это усложнилось.

Мне нужно создать предикат для передачи в мой репозиторий продуктов из строки клиента:

"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, как указано выше?

...