如何将INSERT SELECT联表查询SQL转换为LINQ插入语句
LINQ 实现SELECT结果批量插入的转换方案
你给出的SQL是典型的「关联两表筛选数据后批量写入目标表」的操作,对应等效LINQ实现如下,以最常用的Entity Framework Core场景为例:
核心实现代码
// 1. 构造与SQL逻辑完全一致的关联查询 var licenseRecords = from s in _dbContext.SourceData join p in _dbContext.Person on s.UserID equals p.DomainAccountName where s.isActive == 1 select new License { PersonID = p.PersonID, LicenseState = s.LicenseState, LicenseNumber = s.LicenseNumber, LicenseYear = s.LicenseYear }; // 2. 执行批量插入 // EF Core 6+ 版本可直接传入查询对象,EF会自动生成对应的INSERT...SELECT语句在数据库端执行,不会把数据全量加载到应用内存 await _dbContext.License.AddRangeAsync(licenseRecords); await _dbContext.SaveChangesAsync();
补充说明
- 上述LINQ中的
join为内连接,和你SQL里的JOIN逻辑完全匹配,仅返回两表中关联字段能对应上的记录 - 如果你需要更高的批量插入性能,可以使用对应ORM的批量操作扩展方法,全程在数据库端执行操作,性能比默认的AddRange更高,示例写法:
// 批量扩展方法示例,无需额外调用SaveChanges,直接执行数据库写入 await _dbContext.License.BulkInsertAsync(licenseRecords);
- 如果是操作内存中的集合而非数据库表,查询逻辑完全一致,只需要将DbContext对应的表替换为内存集合,最后将查询结果直接AddRange到目标License集合即可。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

