使用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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因