Пользовательский EF Core AddOrUpdate с составными ключами

Не слушайте этих парней. Вы действительно можете анализировать контекстно-свободные грамматики с регулярным выражением, если вы разбиваете задачу на более мелкие части. Вы можете сгенерировать правильный шаблон с помощью скрипта, который выполняет каждый из этих действий, чтобы:

  1. Решить проблему остановки.
  2. Построить круг (имитировать «линейку и компас» метод для этого).
  3. Разработайте проблему с продавцом в O (log n).
  4. Шаблон будет довольно большим, поэтому убедитесь, что у вас есть алгоритм, который без потерь сжимает случайные данные.
  5. Почти там - просто разделите все это к нулю. Easy-peasy.

Я еще не выяснил последнюю часть, но я знаю, что приближаюсь. Мой код продолжает бросать CthulhuRlyehWgahnaglFhtagnException в последнее время, поэтому я собираюсь передать его на VB 6 и использовать On Error Resume Next. Я обновлю код, как только я исследую эту странную дверь, которая только что открылась в стене. Хмм.

P.S. Пьер де Ферма также выяснил, как это сделать, но край, который он писал, был недостаточно большим для кода.

2
задан Matteo Destro 17 March 2019 в 20:20
поделиться

1 ответ

Проблема, похоже, заключается в использовании константного выражения анонимного типа, которое в настоящее время вызывает оценку клиента , а оператор C # == сравнивает анонимные типы по ссылке, поэтому всегда возвращает false. [ 1111]

Хитрость для получения желаемой трансляции сервера состоит в том, чтобы «вызвать» выражение key с помощью entity, заменив параметр на Expression.Constant(entity) (Expression.Invoke в этом случае не работает)

[1113 ] Поэтому удалите строку 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;
    }
}
0
ответ дан Ivan Stoev 17 March 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: