使用dapper linq c#更新前检查重复项

c# dapper linq

我对Linq和Dapper比较陌生,我正试图找到最有效的插入方式。我有一个列表对象,如下所示:

public class Programs
{
    public int Id { get;set; }
    public int Desc { get;set; }
}

列表对象从页面上的字符串字段填充,该字段通常包含Id的字符串(例如234,342,345,398)。现在在数据库234中,342,345已经存在,因此我真正需要插入的唯一一个是398以及记录Id。我已经有了一个存在的方法,可以获取数据库中当前存在的程序ID。我是否先获取程序ID,然后在执行insert语句之前比较两个列表?我可以使用Linq进行比较吗?有没有更好的办法?

获取程序Id的方法如下所示:

 public static List<Programs> GetPrograms(int id)
 {
    var sql = new StringBuilder();
    sql.Append("select Id, Desc from dbo.Programs where Id = @id");
    return con.Query<Programs>(sql.ToString(), new { Id = id }, commandType: CommandType.Text).ToList();
 }

热门答案

在做了一些查看所有选项后,似乎我的情况的一些选项是执行以下操作之一:

  • 将新列表值与后面代码中的旧列表值进行比较,然后使用一个简单的insert语句,该语句只传递不同的值
  • 将列表传递给dao层,从db中获取列表的新副本,比较代码中的列表然后只插入不同的列表
  • 将列表发送到db,使用while循环在sql级别进行比较并插入

由于我的目标是使用Linq和Dapper完成此任务,因此我选择了第一个选项。这是我为获得我需要的值而做出的linq语句:

 save.ProgramList = hiddenFieldProgramIds.Value.Split(',')
     .Select(n => new Programs(){ id = int.Parse(n) })
     .Where(n => !program.ProgramList.Select(d => d.id).Contains(n.id)).ToList();

然后,dapper调用只是一个直接插入语句,使用基于先前建议的var。

 var sql = @"insert into dbo.programTable(Id) select @id";
 con.Execute(sql, new { id = id }, commandType: commandType.Text, commandTimeout: 5000);


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow