Я предполагаю, что ваш второй фрагмент кода является просто усеченным примером - если вы действительно это сделаете, то результаты будут непредсказуемыми, потому что вы берете первое свойство, возвращаемое отражением, которое может меняться между запусками вашей программы.
Вы получите лучшие ответы, если скажете «Это сработало», за которым следует описание того, что произошло, и «Это не сработало», а затем описание того, как вы могли бы сказать, что это не сработало (ошибка компилятора «ошибка времени выполнения» сообщение об исключении?)
Во-первых, знаете ли вы Dynamic Linq ? Он позволяет вам отложить принятие решения о том, как запрос должен быть структурирован, до времени выполнения и может решить многие ваши проблемы за вас.
Но при условии, что это учебное упражнение ...
Ваш метод расширения Like
принимает выражение (которое вызывающий должен обычно записывать как лямбда, поскольку в этом весь смысл этих вещей). Это выражение преобразует «запись» из набора результатов запроса и возвращает строковое значение (предположительно, выбирая его из данных, хранящихся в записи). Метод также принимает строку значения.
Но затем он создает (вручную) свой собственный предикат, который вызывает метод Contains
для тела field
лямбда.
Я думаю, это должно сработать, потому что результатом этой лямбды является строка. Тем не менее, я не понимаю, почему вы делаете это трудным путем. Что не так с:
var result = from e in context.es
where e.Field.Contains("xxx"))
select e