gpt4 book ai didi

c# - 如何在只有一个数据库查询的情况下在计数器字段上执行 +1?

转载 作者:行者123 更新时间:2023-11-30 18:46:00 24 4
gpt4 key购买 nike

我有一个字段,用于计算用户的订阅总数。现在我像这样更新这个字段:

using (var context = new AppDbContext())
{
var foundEntry = context.Users.Find(id);
if (foundEntry != null)
{
foundEntry.TotalSubscriptions = foundEntry.TotalSubscriptions + 1;
context.Entry(foundEntry).CurrentValues.SetValues(foundEntry);

var result = context.SaveChanges();
}
}

但是这样我必须对数据库进行 2 次查询。一个用于获取当前总数,一个用于更新值。

有没有办法只用 Entity Framework 查询一次数据库就可以做到这一点?

我想尝试这样的事情:

var user = new User() { Id = userId, TotalSubscriptions = currentS + 1 };
db.Users.Attach(user);
db.Entry(user).Property(x => x.TotalSubscriptions).IsModified = true;

但我面临的问题是我必须先获取当前计数,但不知道如何在单个查询中进行操作。我认为使用原始 SQL 语句/查询可以对此进行 1 次查询。

我正试图归档这样的东西:https://stackoverflow.com/a/2762856/1286942但有 Entity Framework 。

更新

我也试过这样的:

var user = new User() { Id = userId };
db.Users.Attach(user);
user.TotalSubscriptions = context.Entry(user)
.Property(u => u.TotalSubscriptions).OriginalValue + 1;
db.Entry(user).Property(x => x.TotalSubscriptions).IsModified = true;

但问题是 .OriginalValue.OriginalValue 总是返回 0。所以 TotalSubscriptions 字段总是更新为 -1或 1.

更新 #2

现在我只看到这个作为一个选项:

var numberOfUpdatedRows = context.Database
.ExecuteSqlCommand("UPDATE dbo.Users
SET TotalSubscriptions = TotalSubscriptions + 1
WHERE id = " + id + "");

最佳答案

此类代码的基本方法是为您的 SQL 代码使用存储过程,并将变量值传递给该过程。这是您的问题的可能解决方案。

CREATE PROCEDURE AdjustSubscriptions 
@userid int,
@adjustment int
AS
BEGIN
DECLARE @subs int
SET NOCOUNT ON

UPDATE UserInfo
SET @subs = currentS + @adjustment, currentS = @subs
WHERE userID = @userid

SELECT @subs AS SubscriptionCount
END

这会将 currentS 值选择到一个变量中,按照@adjustment 中指定的值对其进行调整,(添加三个订阅?传递一个三。删除三个订阅?传递一个负三)然后将值更新到保存的行.最后,返回仅包含调整后的 subscriptionCount 值的行。

可以重写存储过程以在 OUTPUT 变量中返回值(如果实现正确,您只需将值返回到变量中,而不必处理记录集),甚至可以使用 RETURN @subs 语句在程序结束时将调整后的值作为返回值返回。我强烈建议您不要使用 RETURN @subs 方法,因为它会在返回字符串或 smallint 之外的值时中断。

我留给您实现 Entity Framework 代码来处理存储过程。我不相信您可以在 Entity Framework 内使用一次调用对值进行同样的直接操作,但我非常愿意以其他方式展示。

快乐编码。

关于c# - 如何在只有一个数据库查询的情况下在计数器字段上执行 +1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com