全国数字货币钱包安装地址:tp9.app,bit16.app,tp784.app,tp888.app,im784.app,im45.app,tokenn.app,imtooken.app,imgw.app,imtom.vip,imtokemn.app,im116.app,imtokne.app,immtoken.app,im钱包.com,imtkem.app,tokim.app,im87.app,tptoka.app,tp钱包.cn,im112.app,im1.app,bitpia.app,imzg.app,imkem.vip,im70.app,im003.app,im82.app,tokim.app,imqb.app,tookeni.app,a471.cc,tokne.app,tokonii.app,imtokes.app,im1122.app,imkct.app,imkd.app,imkct.app,imtek.app,im22.im,imken.app ,tp114.app,bit114.app,imkenn.app,tp115.app,bit115.app,im221.cn,im888.app
数据库操作中,提高数据修改效率是一大关键问题。EF Core 7.0的ExecuteUpdate方法,将LINQ查询与批量修改功能融合,有效降低了数据库的交互次数,对开发者而言,这一特性颇具吸引力。
EF Core 7.0新特性
项目中,数据更新速度缓慢,若当时能运用这个新方法,效率将大大提升。EF Core 7.0版本引入的ExecuteUpdate方法,有效减少了数据库的往返次数,降低了更新过程中的时间消耗和人力成本。这使得开发者在处理大量数据更新时,能够更加高效地完成任务。
在大型企业中,诸如亚马逊仓库管理系统这样的项目,它们处理的数据量庞大。如果数据更新不够高效,那么由此造成的损失将是巨大的,难以准确计算。
数据批量更新的意义
大量更新显得尤为关键。以往,每次对数据进行修改,都必须与数据库进行一次交流。以一家拥有1万条银行分行信息的银行为例,若逐个对分行的状态等数据进行更新,那么就需要进行1万次的数据交互。这样的操作在时间上可能需要数小时之久。
若实行批量更新,往往只需几次操作即可完成。比如,在处理北京某银行的分行数据时,通过批量更新,原本需要耗时的工作可以在几分钟内完成,大大节省了时间和计算资源。
public async Task<int> UpdateBranchSingleTable()
{
return await _context.Set<Branch>()
.Where(b => b.IsDeleted == true)
.ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Decommissioned" + m.Name + "!"));
}
单表操作示例
UPDATE [t]
SET [t].[Name] = (N'Decommissioned' + [t].[Name]) + N'!'
FROM [tt_branch] AS [t]
WHERE [t].[IsDeleted] = CAST(1 AS bit)
在进行单表操作时,存在一定的操作规则。以银行分行的数据表为例,若需处理那些已关闭的分行,即IsDeleted字段值为真的分行,我们需要在其名称前加上“已停用”字样。这类大规模的更新操作,正是ExecuteUpdate功能得以发挥效用的场景。
我在上海一家金融机构工作,曾遇到过类似任务。那时,我需要修改上千个已终止项目的名称。若非有批量操作功能,就得一个一个地手动修改,效率极低。有了这个功能,我就能快速完成,大大提升了工作效率。
多项操作通常较为繁琐。以查询具备外币交易功能的ATM机所属的分行为例,需在分行名称前标注其支持外币业务。这需要先建立分行信息表与ATM机信息表之间的联系,进而识别出哪些分行拥有支持外币交易功能的ATM机。
public async Task<int> UpdateBranchFormMultipleTable()
{
return await _context.Set<Branch>()
.Where(b => b.IsDeleted == false && b.Atms.Any(a => a.SupportForeignCurrency == true))
.ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Global Service " + m.Name));
}
在广州某跨国银行分行的系统升级工程中,我们遇到了类似的情况。那时,我们必须对特定分行进行标记。为了顺利完成这项任务,我们查阅了EF Core的相关文档。最终,通过关联查询和批量更新,我们大大减轻了开发负担。
查看那些职位为Branch Manager的分行信息,然后在这些分行的名称前添加Level 2标记。这同样是一个关联查询后的批量修改任务。在执行此操作时,需要连接分行表和分行经理表进行查询。
public async Task<int> UpdateBranchMultipleTables() {
return await _context.Set<Branch>()
.Where(b => b.IsDeleted == false && b.Manager.Title == "BranchManager")
.ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Level 2" + m.Name));
}
在一家小银行进行系统更新时,我们遇到了类似的需求。原以为需要亲自编写复杂的SQL语句,但后来发现,EF Core 7.0的ExecuteUpdate功能可以轻松解决这一问题。
从这个案例中可以看出,这种方法在处理涉及多个表格之间的关联操作上显得格外便捷。
UPDATE [t]
SET [t].[Name] = N'Level 2' + [t].[Name]
FROM [tt_branch] AS [t]
INNER JOIN [tt_user] AS [t0] ON [t].[Id] = [t0].[Id]
WHERE [t].[IsDeleted] = CAST(0 AS bit) AND [t0].[Title] = N'BranchManager'
对比半自动ORM框架
众人常感疑惑,与Dapple这类半自动ORM框架相较,究竟如何?实际上,经过联合查询操作后的筛选与修改,若手动编写SQL语句,其效果与EF Core 7.0自动生成的结果并无二致。
我之前对比了两种不同的实现方法,经过反复测试,发现它们在数据精确度和执行速度上基本持平。不过,使用EF Core 7.0进行开发更为简便,无需过多忧虑SQL语句的正确性。
现在对EF Core 7.0的ExecuteUpdate方法有了诸多认识。在开发过程中,大家是否会倾向于优先使用这个方法?期待大家点赞、转发此篇文章,并在评论区交流看法。
public class Entity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Timestamp]
public byte[]? Rowversion { get; set; }
public bool IsDeleted { get; set; }
}
[Table("tt_branch")]
public class Branch : Entity
{
[Required]
public string Name { get; set; } = string.Empty;
[Required]
public string Address { get; set; } = string.Empty;
[Required]
public bool hasCreditCardService { get; set; } = false;
[Required]
public bool hasChequeService { get; set; } = false;
public ICollection<ATM> Atms { get; } = new List<ATM>();
public User Manager { get; set; } = null!;
}
public abstract class BankDevice : Entity
{
[Required]
public string Name { get; set; } = string.Empty;
[Required]
public DeviceStatus DeviceStatus { get; set; } = DeviceStatus.Running;
}
[Table("tt_atm")]
public class ATM : BankDevice
{
[Required]
public bool SupportForeignCurrency { get; set; } = false;
}
public enum DeviceStatus
{
Running = 1,
Standby,
Maintance
}
[Table("tt_user")]
public class User:Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
public Branch Branch { get; set; } = null!;
}
全国数字货币钱包安装地址:tp9.app,bit16.app,tp784.app,tp888.app,im784.app,im45.app,tokenn.app,imtooken.app,imgw.app,imtom.vip,imtokemn.app,im116.app,imtokne.app,immtoken.app,im钱包.com,imtkem.app,tokim.app,im87.app,tptoka.app,tp钱包.cn,im112.app,im1.app,bitpia.app,imzg.app,imkem.vip,im70.app,im003.app,im82.app,tokim.app,imqb.app,tookeni.app,a471.cc,tokne.app,tokonii.app,imtokes.app,im1122.app,imkct.app,imkd.app,imkct.app,imtek.app,im22.im,imken.app ,tp114.app,bit114.app,imkenn.app,tp115.app,bit115.app,im221.cn,im888.app