我需要删除/更新一个表的给定行数.

其中一个我是这样解决的:

  await context.MyItems
    .Where(x => itemsIds.Contains(x.Id))
    .ExecuteUpdateAsync(f => f.SetProperty(x => x.State, state));

这允许我在给定的id列表中更新项目(1,2,5,7,...)

但我不确定如何在需要按多个属性的列表而不是ID列表进行筛选的表中进行同样的操作:

var itemsToUpdate = new List<Identifier>(){ ....}

标识符是

public class Identifier
{
    DateTime date {get;set;}
    string code {get;set;}
    string owner {get;set;}
    
}

有什么 idea 如何在EF Core中有效地做到这一点吗?因为我认为我没有其他解决方案,而是一个存储过程:—(

为了更清晰,原始功能:

public async Task UpdateItemsAsync(IList<long> Ids, ItemStatus state)
{
    await context.myItems
        .Where(x => Ids.Contains(x.Id))
         .ExecuteUpdateAsync(f => f.SetProperty(x => x.State, state));
}

新增功能:

public async Task UpdateItemsAsync(IList<Identifier> Ids, ItemStatus state)
{
   //can´t figure out how to apply filter here
}

推荐答案

您可以使用表值参数来执行此操作.

首先创建一个表类型

CREATE TYPE dbo.Identifier AS TABLE (
    date datetime(7),
    code nvarchar(100),
    owner nvarchar(100)
)

在EF Core 7和更早版本中,因为它是多列类型,所以你不能使用context.Database.SqlQuery,你需要在模型中添加一个实体.

modelBuilder.Entity<Identifier>().HasNoKey().ToView(null);

然后你可以这样使用它:

var table = new DataTable { Columns = {
    { "date", typeof(DateTime) },
    { "code", typeof(string) },
    { "owner", typeof(string) },
};
foreach (var item in items)
{
    table.Add(item.date, item.code, item.owner);
}

// must create this part in a separate step
var itemsTvp = context.Set<Identifier>().FromSqlRaw(
    "SELECT * FROM @tmp",
    new SqlParameter("@tmp", table) { TypeName = "dbo.Identifier", Value = table }
);
//

await context.MyItems
    .Where(x => itemsTvp.Any(t => t.date = x.date && t.code == x.code && t.owner == x.owner)
    .ExecuteUpdateAsync(f => f.SetProperty(x => x.State, state));

在EF Core 8中,您不需要实体,只需使用

var itemsTvp = context.Database.SqlQueryRaw<Identifier>(

Csharp相关问答推荐

C#中的包版本控制

MongoDB将JS查询转换为C#的问题

如何使用XmlSerializer反序列化字符串数组?

不带身份的Blazor服务器.Net 8 Cookie身份验证

Rider将.NET安装在哪里

使用两个不同的枚举作为Switch语句中的CASE生成唯一值

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

当我没有此令牌时,为什么语法报告EOF错误?

.NET 6:如何防止系统生成的日志(log)?

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

数据库.Migrate在对接容器重启时失败

如何使用Npgsql从SELECT获得所有查询结果

如何在特定环境中运行dotnet测试?

如何正确处置所有动态控件?

如何为控制器PUT操作绑定对象数组

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

如何保存具有多个重叠图片框的图片框?

如何对正方形格线进行对角分组

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>