Не удалось создать постоянное значение типа "System.Object" в Entity Framework
У меня есть таблица с именем UserTenders
, имеющая отношения "много-к-одному" с таблицей aspnet_Membership
.
Я использую EntityFramework 4.0, и когда я пытаюсь что-то вроде этого, это ошибки.
var tenders = ctx.UserTenders
.Where(tender => tender.HasAdminApproved.Equals(true))
.ToList();
Ошибка
System.NotSupportedException
Не удалось создать постоянное значение типа "System.Object".
В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).
Этот фрагмент ниже работает.
var tenders = ctx.UserTenders.ToList();
Что может быть неправильным в моем коде? Почувствуйте, что я пропускаю что-то очень тривиальное.
Я хотел бы отфильтровать все те строки, у которых есть поле bit
HasAdminApproved
, как true
Ответы
Ответ 1
Попробуйте заменить
.Where(tender => tender.HasAdminApproved.Equals(true))
С
.Where(tender => tender.HasAdminApproved == true)
Или как ранее было предложено @Ladislav Mrnka, если ваше поле bool?
.Where(tender => tender.HasAdminApproved)
Ответ 2
@Ladislav сказал вам правильный ответ (.Where(tender => tender.HasAdminApproved)
), но вы можете удивиться, почему вы получили это сообщение.
Вы пытаетесь вызвать System.Boolean.Equals(Object obj)
. Итак, вы боксируете константу true
. И L2E, как говорится в сообщении, не поддерживает константу не примитивного типа типа System.Object
. Отсюда ошибка.
Ответ 3
У меня было такое же исключение, вызванное другой проблемой: a char по сравнению с строкой, используемой как константа. Мой выбор выглядел так:
from p in Person
select new Foo
{
FullName = p.FirstName + ' ' + p.LastName
}
Булевы условные выражения, которые у меня были в другом месте запроса (т.е. "где p.IsActive" ), работали нормально. Мне пришлось переключиться на использование строки:
from p in Person
select new Foo
{
FullName = p.FirstName + " " + p.LastName
}
Это, очевидно, не ответ на вопрос OP, но мне не удалось найти аналогичный вопрос с проблемой char/string, поэтому я хотел опубликовать его для других.
Ответ 4
Просто хотел указать, вы могли бы также использовать tender.HasAdminApproved.HasValue.Equals(true))... это работает, когда bool допускает nulls