Это из-за Expression.Constant(key)
. Постоянные выражения значения не параметризуются транслятором запроса. Вам нужно выражение, ссылающееся на свойство или поле другого выражения (которое может быть константой). Это в основном то, что компилятор C # испускает для замыканий.
Одним из способов является использование компилятора C # для создания лямбда-выражения с замыканием и получения тела:
Expression<Func<TKey>> keyValue = () => key;
var variableRef = key.Body;
(variableRef
является заменой вашего constantRef
)
Другой способ - использовать анонимный, кортежный или определенный тип класса для создания явного экземпляра замыкания и связывания соответствующего свойства или поля. Например, с анонимным типом:
var variableRef = Expression.Property(Expression.Constant(new { key }), "key");
или System.Tuple
:
var variableRef = Expression.Property(Expression.Constant(Tuple.Create(key)), "Item1");
Реальный метод на самом деле не имеет значения (лично я предпочитаю первый вариант с лямбдой) - все они будут вызывать создание параметра с помощью транслятора запросов EF Core.