У меня возникли проблемы с пониманием различий между тем, как работают выражения и функции Funcs. Эта проблема возникла, когда кто-то изменил подпись метода из:
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
нет?