Получить тело Linq.Expression из UnaryExpression C # - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы расширить и до существующего выражения, добавив к нему. Так что логически я хочу exp3:

exp1 = o => (((o.AuditDateTime > 10/04/2018 00:00:00) && (o.AuditDateTime < 18/04/2018 00:00:00)))
exp2 = o => (o.EventType == "X")
exp3 = o => (((o.AuditDateTime > 10/04/2018 00:00:00) && (o.AuditDateTime < 18/04/2018 00:00:00))) && (o.EventType == "X")

У меня есть экземпляр IQueryable с уже определенным выражением Where, что-то вроде:

{AuditJournalEntity[].Where(o => (((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00))))}

Таким образом, я могу получить фактическое выражение where самостоятельно, используя массив Arguments (Arguments [1]):

{o => (((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00)))}

Тем не менее, я не знаю, как получить часть тела выражения UnaryExpression, чтобы добавить ее позже. То, что я хочу, это часть:

(((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00)))

Если в отладке, он может передать эту часть, используя что-то, например, экземпляр UnaryExpressionProxy, но это закрытый член, так что я не могу его использовать. Дайте мне знать, если вам нужно больше информации.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать UnaryExpression.Operand свойство.

В вашем сценарии, я думаю, вы хотите получить предикатное лямбда-выражение. Который для IQueryable<T> источника обернут в UnaryExpression методом Expression.Quote. Таким образом, вы можете использовать что-то вроде этого:

static LambdaExpression ExtractLambda(Expression source)
{
    while (source != null && source.NodeType == ExpressionType.Quote)
        source = ((UnaryExpression)source).Operand;
    return source as LambdaExpression;
}

Затем вы можете получить тело, используя свойство LambdaExpression.Body.

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