Entity Framework - Linq - Невозможно создать постоянное значение типа «System.Object». Только примитивные типы - PullRequest
1 голос
/ 08 декабря 2010

У меня есть метод для построения выражения для запроса linq для заданного типа, свойства и значения. Это прекрасно работает до тех пор, пока свойство типа НЕ обнуляется. Вот пример, из которого я работаю (http://www.marcuswhitworth.com/2009/12/dynamic-linq-with-expression-trees) Я вызываю метод Equals для свойства. Однако я обнаружил, что метод Equals для типов Nullable принимает объект в качестве параметра вместо типа Nullable. Я попытался использовать GetValueOrDefault, чтобы скрыть нулевые значения, но EF не поддерживает этот метод. В качестве простого примера следующий код выдаст ошибку:

decimal? testVal = new decimal?(2100);
        var test = (from i in context.Leases where i.AnnualRental.Equals(testVal) select i).ToList();

Однако, если вы используете == вместо метода Equals (), он будет работать нормально. Однако я не уверен, как преобразовать код для использования == вместо Equals (). Любые предложения будут с благодарностью.

1 Ответ

3 голосов
/ 08 декабря 2010

Если вы говорите ==, вы генерируете BinaryExpression с NodeType как ExpressionType.Equal. http://msdn.microsoft.com/en-us/library/bb361179.aspx

Если вы говорите .Equals(x), вы генерируете MethodCallExpression. MethodCallExpression s, которые LinqToEntities может перевести на Sql, является ограниченным списком (например, в этом списке нет ни одного из ваших собственных неокрашенных методов). Nullable<T>.Equals(x), по-видимому, нет в этом списке.

Не говорите .Equals(x) LinqToEntities.

...