Не удалось создать постоянное значение типа "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