У меня проблема с динамически генерируемым по сравнению с регулярным лямбда-выражением в коде. Ниже приведен код, который я использую для создания динамической лямбды.
Динамическая лямбда для C
var parameterExp = Expression.Parameter(typeof(T), "x");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
Лямбда из режима отладки
{x => x.Name.Contains("UserName")}
Но когда я делаю лямбду в коде, как это
x => x.Name.Contains("UserName");
Я получаю это за результат. FormattedText - это переменная, используемая для регулярной лямбда.
{x => x.Name.Contains(value(Test.BusinessLogicLayer.ClassBLL+<>x__DisplayClass8).formattedText)}
Я использую лямбда в предложении where на объекте Iqueryable. Динамическая лямбда генерирует SQL в Iqueryable без параметров SQL. Регулярная лямбда заставляет SQL иметь параметры. Мне нужно было бы генерировать с параметрами. Мы перебираем параметры, чтобы сменить подобное на a, чтобы мы могли использовать полнотекстовый поиск на SQL-сервере.
Мои вопросы: есть ли способ динамически генерировать лямбда, чтобы иметь тот же результат, что и обычная лямбда? Или есть лучший способ использовать полнотекстовый поиск в Entity Framework 6?
Поскольку вы объявляете значение как константу (Expression.Constant), я бы предположил, что EF просто генерирует этот SQL без параметров, поскольку он знает, что константа не может измениться.
Возможно, вам было бы лучше создать лямбду, которая явно принимает параметр при вводе?
var parameterExp = Expression.Parameter(typeof(T), "x");
var containsParameter = Expression.Parameter(typeof(string), "p");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var containsMethodExp = Expression.Call(propertyExp, method, containsParameter);
Который будет генерировать
(x, p) => x.Name.Contains(p)
"UserName"
, но вместо этого вы ссылаетесь на переменную или свойство. Пожалуйста, вставьте лямбда в точности так, как это выглядит в вашем коде, пожалуйста, не делайте манипуляций, не используйте псевдокодT
выше?