Как создать дерево выражений, чтобы сделать что-то похожее на команду SQL «Нравится» - PullRequest
5 голосов
/ 20 июля 2010

Я работаю над кодом дерева выражений, написанным коллегой, и изучаю возможность добавления дополнительных выражений.В настоящее время он поддерживает: equals, not-equals, IsNull и т. Д. Мне нужно добавить что-то, что позволит использовать сопоставление с подстановочными знаками, похожее на команду SQL «Like» или использование регулярных выражений.На данный момент код анализирует XML-файл и извлекает данные, которые затем обрабатываются с использованием кода, аналогичного строке, показанной ниже.Это пример выражения «Равный».«CallExp» - это MemberExpression, которое в основном содержит имя поля моей таблицы (Entities), а GetConstantExpression получает подробные данные о данных, которые я сравниваю.

xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element("Value"), callExp.Type));

То, что мне нужно, это способ создания «Выражение », аналогичное команде« Мне нравится ».Можно ли это сделать, используя несколько строк, аналогичных приведенным выше, или это будет более сложным?Любые хорошие ресурсы, которые могут помочь в этой области?

=================================================================================

Новый код, основанный на обратной связи:

Я просматривал несколько примеров и пробовал следующее, которое, как я надеялся, создаст мне выражение.Это дает мне ошибку, показанную ниже.Собираюсь ли я в правильном направлении, чтобы создать выражение «StartsWith»?_entityExp является ссылкой ParameterExpression на MyClass.

ParameterExpression p = Expression.Parameter(_entityExp.Type, "entity");
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
var containsMethodExp = Expression.Call(p, method, Expression.Constant("root"), p);

Метод 'Boolean StartsWith (System.String)', объявленный для типа 'System.String', не может быть вызван с экземпляром типа 'MyClass'

Ответы [ 2 ]

7 голосов
/ 20 июля 2010

Деревья выражений могут представлять только ту же функциональность, что и в языках .NET - вызовы методов, оценка свойств и т. Д.

Самое близкое, что вы обычно получаете к "лайку", это вызывать string.StartsWith,string.EndsWith или string.Contains.Если вы хотите вместо этого иметь дело с регулярными выражениями, вы можете использовать Regex.IsMatch.В любом случае, это то, что заключено в методах , а не в «язык» самих деревьев выражений.

Не зная больше о том, как потребляются ваши деревья выражений, трудно сказать,именно то, что вы должны сделать.Вы могли бы создать свой собственный метод «Мне нравится», который потребитель мог бы заметить и обработать соответствующим образом, например ... или вы могли бы использовать существующие методы string / regex.

2 голосов
/ 20 июля 2010
...