实体框架SQL查询引发转换错误

时间:2019-09-29 07:23:58

标签: sql sql-server entity-framework asp.net-core

我有一个简单的查询,我想从表中返回记录的一列,该表可以是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语句,错误发生在返回之前。

我不确定此转换错误发生的位置/原因,我可以使其与存储过程一起使用,但是我想了解为什么此版本失败。

1 个答案:

答案 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。