У меня возникли проблемы с пониманием различий между работой выражений и функций.
Эта проблема возникла, когда кто-то изменил сигнатуру метода с:
public static List<Thing> ThingList(Func<Thing, bool> aWhere)
Для
public static List<Thing> ThingList(Expression<Func<Thing, bool>> aWhere)
Который сломал мой код вызова. Старый код вызова (который работал) выглядел так:
...
object y = new object();
Func<Thing, bool> whereFunc = (p) => p == y;
things = ThingManager.ThingList(whereFunc);
Новый код (который не работает) выглядит так:
...
object x = new object();
Expression<Func<Thing, bool>> whereExpr = (p) => p == x;
things = ThingManager.ThingList(whereExpr);
Сбой внутри ThingList (...) в строке с использованием выражения:
var query = (from t in context.Things.Where(aWhere)
...
С ошибкой во время выполнения:
Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
Этот пример надуманный, но я предполагаю, что он как-то связан с локальной переменной объекта x, которая неправильно «копируется» в выражение.
Может кто-нибудь объяснить, как справиться с этой ситуацией в целом, и почему Func
работает, а Expression
нет?