Деревья выражений и типы Nullable - PullRequest
18 голосов
/ 21 февраля 2011

Я играл с деревьями выражений.У меня есть следующий простой метод, который выполняет запрос путем динамического создания дерева выражений.ItemType - это пустое значение типа int в базе данных , а также в классе сущностей EF .По какой-то причине запрос выдает ошибку

Необработанное исключение: System.InvalidOperationException: бинарный оператор Equal не определен для типов 'System.Nullable`1 [System.Int32]' и 'System.Int32 '.

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

Обратите внимание, я смотрел на это

Работа с обнуляемыми типами в выраженииДеревья

Но этот парень пытается передать ему значение nullable int, типизированное как object, с которым EF, я думаю, есть проблемы.Я на самом деле объявляю это как правильный тип ab initio .

   public void GetResultCollection<T>() {
        MyEntities db = new MyEntities();
        var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));

        int? ItemTypeValue = 1;

        var param = Expression.Parameter(typeof(T));

        var lambda = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(
                Expression.Property(param, "ItemType"),
                Expression.Constant(ItemTypeValue)),
            param);

        var list = result.Where(lambda).ToList();
    }

EDIT

Я также пытался ItemTypeValue.Value -та же ошибка

1 Ответ

24 голосов
/ 21 февраля 2011

Я думаю, вам нужно конвертировать

var right = Expression.Constant(ItemTypeValue , typeof(int?))
....

 var lambda = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(
                Expression.Property(param, "ItemType"),
                right),
            param);
...