중복 된 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는 레코드 ID와 함께 398입니다. 나는 이미 존재하는 기존의 프로그램 ID를 데이터베이스에 저장하는 메소드를 이미 가지고있다. insert 문을 실행하기 전에 프로그램 ID를 가져 와서 두 목록을 비교합니까? 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