我想更新 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 查询中的字符串传递,但也许有更好的解决方案)。
试试这个:
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 });
我创建了一个表类型参数:
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]"
};
需要使用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 });