es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Coincidencia de dos conjuntos de datos con C# y LinQ

Tengo que importar información de un archivo de texto sin formato, coincidiéndola con un registro de la base de datos utilizando tres campos.

Campos de la base de datos:
RowId, DF1, DF2, DF3,

Campos del archivo de texto:
TF1, TF2, TF3, TF4

Coincidencia:
DF1 = TF1
DF2 = TF2
DF3 = TF3

Resultado:
RowID, TF4 (Opcional, F1, F2, F3)

Debido a mi poca experiencia con C# y LinQ, esto está resultando problemático.

Intenté cargar la tabla de la base de datos y el archivo de texto en dos DataTables diferentes, y convertirlas en asEnumerable() para usarlas con LinQ, pero no puedo encontrar una referencia de código para construir correctamente el LinQ.

var result = (from db in dtDB.AsEnumerable()
join txt in dtTxt.AsEnumerable() on <<INSTRUCCIÓN DE COINCIDENCIA>>
where <<INSTRUCCIÓN WHERE>>
select new {
           db.RowID,
//         F1,
//         F2,
//         F3,
           txt.TF4
}).asArray

El problema es cómo hacer referencia a cada campo en el “Enumerable” y construir las instrucciones de coincidencia y where.
¿Debería usar otra estructura en lugar de DataTables?
Cualquier indicación sobre cómo resolver esto sería útil.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer coincidir los campos entre la DataTable y el archivo de texto, puedes utilizar la cláusula join en LINQ. Aquí tienes un ejemplo de cómo podrías modificar tu consulta LINQ:

    var result = (from db in dtDB.AsEnumerable()
                  join txt in dtTxt.AsEnumerable() 
                  on new { DF1 = db.Field<string>("DF1"), DF2 = db.Field<string>("DF2"), DF3 = db.Field<string>("DF3") }
                  equals new { DF1 = txt.Field<string>("TF1"), DF2 = txt.Field<string>("TF2"), DF3 = txt.Field<string>("TF3") }
                  select new {
                     db.Field<int>("RowId"),
                     txt.Field<string>("TF4"),
                     // agregar F1, F2, F3 según sea necesario
                  }).ToArray();
    

    En la cláusula join, creas un nuevo objeto que contiene los valores de DF1, DF2 y DF3 de la tabla DB, y otro objeto que contiene los valores de TF1, TF2 y TF3 del archivo de texto. La palabra clave equals compara los dos objetos para determinar si son iguales.

    Luego puedes seleccionar el RowId y TF4 (y cualquier otro campo que necesites) de las filas coincidentes.

    Utilizar DataTables es una elección razonable para esta tarea, pero también podrías considerar utilizar un objeto personalizado para almacenar los datos del archivo de texto, lo que podría facilitar su manipulación en LINQ.

Comments are closed.