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.
这有什么问题?我之前没有改变任何代码。就在这次我遇到了错误。
答案 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
都是不可为空的,因此匿名类型中属性的结果属性类型为DoNotEmail
。 bool
没有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,然后重试。