使用 EF Core 更新多条记录

问题描述 投票:0回答:3

我想更新 SQL 表中的一些记录,而不是基于它们的主 ID。这是一个简单的查询:

context.Database.ExecuteSqlRawAsync("UPDATE [FileInfos] SET [DeleteTimeUtc] = {0} WHERE FileId IN ({1});", parameters: parameters);

第一个参数是日期时间参数,我这样创建:

object[] parameters = {
    new SqlParameter("@now", SqlDbType.DateTime)
    {
        Value = DateTime.UtcNow
    }
};

我不知道如何创建第二个参数(我假设我可以将它们作为 SQL 查询中的字符串传递,但也许有更好的解决方案)。

c# entity-framework entity-framework-core
3个回答
0
投票

试试这个:

    var utcNow = new SqlParameter("@now", DateTime.UtcNow);
    var idIn = new SqlParameter("@idIn", "1,2,3");
context.Database.ExecuteSqlRawAsync("UPDATE [FileInfos] SET [DeleteTimeUtc] = @now WHERE FileId IN @idIn"),  parameters: new[] { utcNow, idIn });


0
投票

我创建了一个表类型参数:

CREATE TYPE [dbo].[FileIdentifierType] AS TABLE (FileId uniqueidentifier)

当我调用 update sql 命令时,我会在结构化参数中传递文件列表:

        var table = new DataTable();
        table.Columns.Add("FileId", typeof(Guid));
        foreach (var fileId in fileIds)
        {
            table.Rows.Add(fileId);
        }

        var fileIdsParameter = new SqlParameter("@FileIds", SqlDbType.Structured)
        {
            Value = table,
            TypeName = "[dbo].[FileIdentifierType]"
        };

0
投票

需要使用EF吗?这可以使用 Dapper 轻松完成。

var now = DateTime.UtcNow;
var ids = new [] { 1, 2, 3 };

const string sql =
@"UPDATE [FileInfos] 
SET [DeleteTimeUtc] = @now 
WHERE FileId IN @ids";

await using var connection = new SqlConnection(_context.Database.GetConnectionString());
await connection.ExecuteAsync(sql, new { now, ids });
© www.soinside.com 2019 - 2024. All rights reserved.