从数据库获取整数值

时间:2019-04-16 17:11:17

标签: entity-framework asp.net-core

我如何从数据库中获取整数值? 表有4列 ID,作者,喜欢,不喜欢。

我想获得“不喜欢”金额并添加1。 我尝试

var db = new memyContext();
var amountLike = db.Memy.Where(s => s.IdMema == id).select(like);
memy.like=amountLike+1;

我知道这是不好的方法。 请帮助

1 个答案:

答案 0 :(得分:1)

我不确定您的问题在哪里,但是有些事情可能会有所帮助。

首先,如果您通过合理的选择只有一个匹配项进行检索,或者在您只想要一件事的情况下,则应分别使用SingleOrDefaultFirstOrDefault-而不是WhereWhere适用于您希望多个事物匹配的情况,即结果将是对象的列表,而不是对象。由于您要通过ID查询,因此很明显,您只希望找到一个匹配项。因此:

var memy = db.Memy.SingleOrDefault(s => s.IdMema == id);

第二,如果只需要读取Like,则可以使用Select,但这有两个问题。首先,Select仅可用于枚举,如这里已经讨论的,您只需要一个对象,而不是对象列表。实际上,您可以以某种复杂的方式回避此问题:

var amountLike = db.Memy.Select(x => x.Like).SingleOrDefault(x => x.IdMema == id);

但是,这仍然存在缺陷,因为您不仅需要读取该值,而且还需要写回它,然后才需要它所属对象的上下文。因此,您的代码实际上应如下所示:

var memy = db.Memy.SingleOrDefault(s => s.IdMema == id);
memy.Like++;

换句话说,您拔出要修改的实例,然后在该实例上修改该值。我在这里也使用了增量运算符,因为那样做更有意义。

那只能解决部分问题,因为您当然也需要将此值也保存到数据库中。这也带来了如何获取上下文的附带问题。由于这是EF上下文,因此它实现了IDisposable,因此在完成后应将其丢弃。只需调用db.Dispose()就可以实现,但是最好使用using代替

using (var db = new memyContext())
{
    // do stuff with db
}

当我们在这里时,根据您的问题的标签,您正在使用ASP.NET Core,这意味着即使这不是最佳的。 ASP.NET Core大量使用DI(依赖项注入),并鼓励您也这样做。 EF上下文通常被注册为范围服务,因此应在需要的地方注入。我没有该代码存在的上下文,但是出于说明目的,我们假定它在控制器中:

public class MemyController : Controller
{
    private readonly memyContext _db;

    public MemyController(memyContext db)
    {
        _db = db;
    }

    ...
}

这样,ASP.NET Core将自动将您的上下文实例传递给构造函数,而您不必担心创建上下文或处理它。一切都为您完成。

最后,您需要执行实际的持久性,但这就是事情开始变得棘手的地方,因为您现在很可能需要处理并发概念。该代码可以同时在多个不同的线程上运行,每个线程都以其当前状态查询数据库,递增该值,然后尝试将其保存回去。如果不执行任何操作,则一个线程将不可避免地覆盖另一个线程的更改。例如,假设我们在此对象上同时收到三个“赞”。他们都从数据库中查询对象,并且假设当前的赞计数为0。然后,他们各自将该值递增,使其为1,然后将结果保存回数据库。最终结果是该值将为1,但这是不正确的:刚刚添加了三个赞。

这样,您将需要实现一个信号量以实质上控制此逻辑,一次只能对此对象执行一次类似的操作。这超出了这里的范围,但是在线上有很多关于如何实现该目标的内容。