Comprobación de duplicados antes de actualizar con dapper linq c #

c# dapper linq

Pregunta

Soy relativamente nuevo en Linq y Dapper y estoy tratando de encontrar la forma más efectiva de hacer un inserto. Tengo un objeto de lista que se ve así:

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

El objeto de la lista se rellena desde un campo de cadena en la página que típicamente contiene una cadena de Id (por ejemplo, 234, 342, 345, 398). Ahora en la base de datos 234, 342, 345 ya existe, así que el único que realmente necesito insertar es 398 junto con el Id. De registro. Ya tengo un método que funciona y obtiene los Id del programa actualmente existente en la base de datos. ¿Voy a obtener los Id del programa y luego comparo las dos listas antes de ejecutar el enunciado insert? ¿Puedo usar Linq para hacer la comparación? ¿Hay una mejor manera?

El método que obtiene Id del programa se ve así:

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

Respuesta popular

Después de ver algunas opciones, parece que algunas de las opciones para mi situación pueden ser una de las siguientes:

  • compare los valores de la lista nueva con los valores de la lista anterior en el código subyacente y luego use una instrucción de inserción simple que solo transmite valores que son diferentes
  • pasar la lista a la capa de dao, obtener una nueva copia de la lista de la base de datos, comparar las listas en el código y luego solo insertar las diferentes
  • envíe la lista a la base de datos, haga la comparación en el nivel sql usando un ciclo while e inserte

Como mi objetivo era realizar esta tarea utilizando Linq y Dapper, opté por la primera opción. Esta es la declaración de linq que hice para obtener solo los valores que necesitaba:

 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();

Entonces, la llamada dapper es simplemente una instrucción de inserción directa usando una var basada en el consejo anterior.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow