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が存在するので、私が実際に挿入する必要があるのはレコードIDとともに398だけです。私はすでに存在し、現在の既存のプログラムIDをデータベースに取得するメソッドを持っています。 insert文を実行する前に、プログラムIDを取得してから2つのリストを比較しますか? 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からリストの新しいコピーを取得し、コード内のリストを比較し、異なるものだけを挿入する
  • データベースにリストを送信し、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