Не слушайте этих парней. Вы действительно можете анализировать контекстно-свободные грамматики с регулярным выражением, если вы разбиваете задачу на более мелкие части. Вы можете сгенерировать правильный шаблон с помощью скрипта, который выполняет каждый из этих действий, чтобы:
Я еще не выяснил последнюю часть, но я знаю, что приближаюсь. Мой код продолжает бросать CthulhuRlyehWgahnaglFhtagnException
в последнее время, поэтому я собираюсь передать его на VB 6 и использовать On Error Resume Next
. Я обновлю код, как только я исследую эту странную дверь, которая только что открылась в стене. Хмм.
P.S. Пьер де Ферма также выяснил, как это сделать, но край, который он писал, был недостаточно большим для кода.
Проблема, похоже, заключается в использовании константного выражения анонимного типа, которое в настоящее время вызывает оценку клиента , а оператор C # ==
сравнивает анонимные типы по ссылке, поэтому всегда возвращает false
. [ 1111]
Хитрость для получения желаемой трансляции сервера состоит в том, чтобы «вызвать» выражение key
с помощью entity
, заменив параметр на Expression.Constant(entity)
(Expression.Invoke
в этом случае не работает)
var getKeyFunction = key.Compile();
, если она больше не нужна, и используйте следующее:
foreach (var entity in entities)
{
var parameter = key.Parameters[0];
var body = Expression.Equal(
key.Body,
key.Body.ReplaceParameter(parameter, Expression.Constant(entity))
);
var query = Expression.Lambda<Func<TEntity, bool>>(body, parameter);
var exist = await table.AnyAsync(query);
// ...
}
где ReplaceParameter
- это обычный вспомогательный метод выражения:
public static partial class ExpressionUtils
{
public static Expression ReplaceParameter(this Expression expression, ParameterExpression source, Expression target)
=> new ParameterReplacer { Source = source, Target = target }.Visit(expression);
class ParameterReplacer : ExpressionVisitor
{
public ParameterExpression Source;
public Expression Target;
protected override Expression VisitParameter(ParameterExpression node)
=> node == Source ? Target : node;
}
}