Динамически генерируемая лямбда, дающая другой результат, чем обычная лямбда

1

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

Динамическая лямбда для 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?

  • 0
    Лямбда, которую вы вставили, не соответствует лямбде, которую вы показываете в отладчике. Я подозреваю, что у вас нет буквального аргумента "UserName" , но вместо этого вы ссылаетесь на переменную или свойство. Пожалуйста, вставьте лямбда в точности так, как это выглядит в вашем коде, пожалуйста, не делайте манипуляций, не используйте псевдокод
  • 0
    Какое конкретное значение T выше?
Показать ещё 2 комментария
Теги:
linq
lambda
entity-framework-6

1 ответ

0

Поскольку вы объявляете значение как константу (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)
  • 0
    Да, я попробовал это, и это не работает. Возвращаемая лямбда не соответствует требованию <T, bool>, когда я отправляю ее объекту IQueryable.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню