无法在Entity Framework中创建“System.Object”类型的常量值

时间:2011-07-19 19:48:38

标签: c# asp.net 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

4 个答案:

答案 0 :(得分:30)

尝试替换

.Where(tender => tender.HasAdminApproved.Equals(true))

使用:

.Where(tender => tender.HasAdminApproved == true)

或者如前所述@Ladislav Mrnka,如果您的字段为bool?

.Where(tender => tender.HasAdminApproved)

答案 1 :(得分:19)

@Ladislav告诉你正确答案(.Where(tender => tender.HasAdminApproved)),但你可能想知道为什么会收到这条消息。

您正试图致电System.Boolean.Equals(Object obj)。所以你要拳击常数true。正如消息所说,L2E不支持像System.Object这样的非原始类型的const。因此错误。

答案 2 :(得分:6)

我遇到了由不同问题引起的相同异常: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问题类似的问题,因此我想将其发布给其他人'益处。

答案 3 :(得分:2)

只是想指出,你也可以使用tender.HasAdminApproved.HasValue.Equals(true))...这在bool允许空值时有效