【问题标题】:Insert records using select in LINQ在 LINQ 中使用 select 插入记录
【发布时间】:2022-07-06 23:14:23
【问题描述】:

我们如何将以下查询转换为 LINQ

INSERT INTO License (PersonID, LicenseState, LicenseNumber, LicenseYear)
SELECT p.PersonID,    
       s.LicenseState,  
       s.LicenseNumber,   
       s.LicenseYear    
FROM   SourceData s    
       JOIN Person p    
         ON s.UserID = p.DomainAccountName  
WHERE  s.isActive = 1

【问题讨论】:

  • 不适用于纯 EF Core。但是通过第三方扩展,您可以做到这一点。如果您对此类解决方案感兴趣。
  • 也许提供更多上下文是个好主意,例如您是否使用实体框架,如果您在类中有映射等,等等。根据您的实际情况,我认为没有人可以帮助您。

标签: linq entity-framework-core


【解决方案1】:
var query = from s in db.SourceData
            join p in db.Person on s.UserId equals p.DomainAccountName
            where s.IsActive
            select new License
            {
                 PersonID = p.PersonID,    
                 LicenseState = s.LicenseState,  
                 LicenseNumber = s.LicenseNumber,   
                 LicenseYear = s.LicenseYear    
            };

 db.Licenses.AddRange(query);

这实际上会给你一个 SQL 查询和一堆单独的 SQL INSERTS。或者,您可以使用 Z.EntityFramework.Extensions.EFCore nuget 包,并使用代码

 var query =  ... (same)...
db.Licenses.BulkInsert(query);

应该使用您发布的单个 SQL 语句。

【讨论】:

  • 所以,您为此提供了错误的扩展:) 无论如何,将导致您的选择。
【解决方案2】:

如果您关心性能,则不必向客户端加载任何内容。这就是 EF Core 现在的工作方式,如果你想插入一些东西 - 你必须为 ChangeTracker 提供新记录。

我建议使用 EF Core 扩展 linq2db.EntityFrameworkCore 生成与所讨论的完全相同的查询,但通过 LINQ。请注意,我是创作者之一。

然后您可以执行以下操作:

var query = 
    from s in db.SourceData
    join p in db.Person on s.UserId equals p.DomainAccountName
    where s.IsActive
    select new License
    {
        PersonID = p.PersonID,    
        LicenseState = s.LicenseState,  
        LicenseNumber = s.LicenseNumber,   
        LicenseYear = s.LicenseYear    
    };

await query.InsertAsync(db.License.ToLinqToDBTable(), x => x);

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多