我如何从数据库中获取整数值? 表有4列 ID,作者,喜欢,不喜欢。
我想获得“不喜欢”金额并添加1。 我尝试
var db = new memyContext();
var amountLike = db.Memy.Where(s => s.IdMema == id).select(like);
memy.like=amountLike+1;
我知道这是不好的方法。 请帮助
答案 0 :(得分:1)
我不确定您的问题在哪里,但是有些事情可能会有所帮助。
首先,如果您通过合理的选择只有一个匹配项进行检索,或者在您只想要一件事的情况下,则应分别使用SingleOrDefault
或FirstOrDefault
-而不是Where
。 Where
适用于您希望多个事物匹配的情况,即结果将是对象的列表,而不是对象。由于您要通过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,但这是不正确的:刚刚添加了三个赞。
这样,您将需要实现一个信号量以实质上控制此逻辑,一次只能对此对象执行一次类似的操作。这超出了这里的范围,但是在线上有很多关于如何实现该目标的内容。