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

时间:2014-01-07 21:53:51

标签: c# linq dapper

我对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();
 }

1 个答案:

答案 0 :(得分:1)

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

  • 将新列表值与后面代码中的旧列表值进行比较,然后使用只传递不同值的简单插入语句
  • 将列表传递给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);