我有一个简单的查询,我想从表中返回记录的一列,该表可以是1或0。我试图使用此查询,但出现转换错误:
System.InvalidCastException:'无法将类型为'System.Boolean'的对象转换为类型为'System.Int32'。”
public int GetUserValidFlag(int userId)
{
var query = from r in db.VisUsers
where r.UserId == userId
select r.IsValid;
return Convert.ToInt32(query.FirstOrDefault());
}
我在此类中确实有一个db实例。
上下文:
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
{
}
public DbSet<Category> Categories { get; set; }
public DbSet<SubCategory> SubCategories { get; set; }
public DbSet<VisUser> VisUsers { get; set; }
public DbSet<Project> Projects { get; set; }
}
我也尝试过使用Find():
public int GetUserValidFlag(int userId)
{
var record = db.VisUsers.Find(userId);
return Convert.ToInt32(record.IsValid);
}
注意:这两次尝试均未到达return语句,错误发生在返回之前。
我不确定此转换错误发生的位置/原因,我可以使其与存储过程一起使用,但是我想了解为什么此版本失败。
答案 0 :(得分:0)
数据库通常将布尔标志存储为值为1或0的位字段。EF会将这些标志作为布尔类型映射到实体。通常,在您的代码中,您仅将bool
用作此类标志的方法和属性的数据类型。如果您仍然希望将其转换为Int,则还需要考虑DB值是否可以为空:
如果数据库值不可为空:
return query.Single() ? 1 : 0;
FirstOrDefault
仅在期望0或许多可能结果的情况下才应与order-by子句一起使用。如果您期望1位用户使用该ID,请使用Single
。如果用户ID与记录不匹配,或者返回了多个记录,则将引发异常。如果未找到用户记录,则使用OrDefault
变体会使事情更加混乱。如果要显式检查并处理不存在记录的可能性,请使用OrDefault
方法,否则最好将其作为异常处理。
如果查询的数据库值可以为空:
bool? isValid = query.Single();
return isValid.HasValue && isValid.Value ? 1 : 0;
这将检查该值,如果存在该值,则返回1,然后返回True,否则返回0。