Создайте динамическое выражение функции «Мне нравится» ядра EF - PullRequest
0 голосов
/ 06 сентября 2018

Я написал несколько кодов для создания динамических выражений для фильтрации моей нумерации страниц. Я пытаюсь сделать динамическое выражение встроенных функций EF Core для поиска (EF.Functions.Like).

Я пробовал способ наподобие bottom, но это метод расширения, и при вызове метода первые параметры не используются. Я не знаю, как идти по пути ==> Ef => Function => Like.
Метод должен использоваться следующим образом => Ef.Functions.Like("Property to search", "%Some Pattern")

var likeMethod = typeof(DbFunctionsExtensions)
                        .GetMethods()
                        .Where(p => p.Name == "Like")
                        .First();
string pattern = $"%{finalConstant}%"; 

ConstantExpression likeConstant = Expression.Constant(pattern,typeof(string));

// the member expression is the property expression for example p.Name
var likeMethodCall = Expression.Call(method: likeMethod, arguments: new[] { memberExpression, likeConstant });

var searchLambda = Expression.Lambda<Func<T, bool>>(likeMethodCall, parameter);
query = query.Where(searchLambda);

но это исключение, говорящее

Неправильное количество аргументов, предоставленных для вызова метода 'Boolean Like (Microsoft.EntityFrameworkCore.DbFunctions, System.String, System.String) '\ r \ nИмя параметра: метод

1 Ответ

0 голосов
/ 12 марта 2019

Как уже упоминалось в комментарии, вам необходимо включить EF.Functions в качестве первого параметра:

var likeMethodCall = Expression.Call(likeMethod, new []
{
    Expression.Property(null, typeof(EF).GetProperty("Functions")),
    memberExpression,
    likeConstant 
});
...