- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个字段,用于计算用户的订阅总数。现在我像这样更新这个字段:
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/
我是一名优秀的程序员,十分优秀!