Это не будет работать, потому что метод Suffix
специально обрабатывается при посещении выражения поля
if (methodCall.Method.Name == nameof(SuffixExtensions.Suffix) && methodCall.Arguments.Any())
{
VisitConstantOrVariable(methodCall, _stack);
var callingMember = new ReadOnlyCollection<Expression>(
new List<Expression> { { methodCall.Arguments.First() } }
);
Visit(callingMember);
return methodCall;
}
Таким образом, необходимо вызвать метод расширения, подобный описанному выше Suffix
, чтобы начать, и у него должен быть хотя бы один аргумент.Вы могли бы подумать о предоставлении необязательного параметра со значением по умолчанию «ключевое слово», который будет работать, но деревья выражений не поддерживают это, поэтому не будут работать.
Другой подход заключается в использовании расширения AppendSuffix
метод Expression<Func<T, object>>
чтобы что-то построить;самый хороший способ использовать это - извлечь лямбда-выражение из свободного вызова в переменную
public static class NestHelperExtensions
{
public static Expression<Func<T, object>> KeywordSuffix<T>(this Expression<Func<T, object>> expression)
{
return expression.AppendSuffix("keyword");
}
}
var client = new ElasticClient();
Expression<Func<Person, object>> firstName = f => f.FirstName;
var searchResponse = client.Search<Person>(s => s
.Query(q => q
.Match(m => m
.Field(firstName.KeywordSuffix())
.Query("bar")
)
)
);
Не очень приятный способ 1016 * будет приводить лямбда-выражение к Expression<Func<T, object>>
inline
var searchResponse = client.Search<Person>(s => s
.Query(q => q
.Match(m => m
.Field(((Expression<Func<Person, object>>)(f => f.FirstName)).KeywordSuffix())
.Query("bar")
)
)
);
Другой, возможно, более простой подход - ввести константу для строки "keyword"
и использовать ее в методе расширения Suffix
;он избегает использования строкового литерала повсюду.