转换为值类型'布尔'失败,因为具体化值为null

时间:2015-03-27 07:10:07

标签: c#

public ActionResult Votation(int id=0)
{
    var events = db.Events_Info_tbl.Where(x => x.is_active == true).FirstOrDefault();
    //query the first category
    List<CampaignManager_tbl> candidates = new List<CampaignManager_tbl>();

    candidates = (from cat in db.Events_Category_tbl
                 join can in db.Candidates_Info_tbl 
                 on cat.events_category_id equals can.events_category_id
                 where cat.events_info_id == events.events_info_id
                 select new CampaignManager_tbl {
                     events_category_name = cat.events_category_name,
                     candidates_fullname = can.candidates_fullname,
                     candidates_info_id = can.candidates_info_id,
                     vote_no = cat.vote_no.Value,
                     isSelected = can.isSelected.Value,
                     events_category_id = cat.events_category_id
                 }).ToList();

    return View(candidates);
}

此代码之前正在运行,但现在我遇到了此错误:The cast to value type 'Boolean' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

这有什么问题?我之前没有改变任何代码。就在这次我遇到了错误。

3 个答案:

答案 0 :(得分:3)

由于不同的问题,我遇到了这个错误。在我的查询中,我从帐户成员及其关联帐户中选择特定列:

.... for i, arr in enumerate(my_list_of_arrays) ...

我的两个布尔属性DBContext.Set<AccountMember>() .Include(am => am.Account) .Select(am => new { am.ID, am.IsPrimary, Account = new { am.Account.ID, am.Account.DoNotEmail } }); IsPrimary都是不可为空的,因此匿名类型中属性的结果属性类型为DoNotEmailbool没有AccountMember时会发生异常。由于Account为null,因此表达式am.Account返回null。但是匿名类型的am.Account.DoNotEmail属性推断它是DoNotEmail类型,不能设置为null。解决方案是通过将属性转换为bool来提示它应该是一个可以为空的bool:

bool?

Hapily EF很聪明,可以忽略这个演员而不会试图将其转换为SQL。

答案 1 :(得分:1)

我在这里走出困境,但我猜它与这条线有关:

 isSelected = can.isSelected.Value,

如果连接两个表时,其中一个表不返回该特定字段的值,则它将为null。这里的类型似乎是某种类型的nullable - 可能是基于命名的bool? - 这将与您的错误相匹配。

尝试使用以下内容替换它:

isSelected = can.isSelected.HasValue ? can.isSelected.Value : false,

当然,您可以将此处的默认false替换为true,如果在您的情况下更有意义的话。

修改:请注意,您应该以类似的方式对您使用的其他列执行相同操作(我假设这会返回int?):

vote_no = cat.vote_no.HasValue ? cat.vote_no.Value : 0

答案 2 :(得分:0)

db.Candidates_Info_tbl.IsSelected是位字段吗?

如果是这样,查询可能会导致

isSelected = can.isSelected.Value,

,其中isSelected为空,而您可能在isSelected类中将CampaignManager_tbl声明为bool。

isSelected类中将CampaignManager_tbl更改为bool,然后重试。