C # enlaza cómo completar la lista principal con la sublista de dos listas relacionadas

c# dapper linq nested-lists

Pregunta

Soy nuevo en Linq, pero necesito terminar un código rápidamente. Tengo dos clases:

public class SAPMember
{
    public string EmployeeNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<CostCentre> CostCentres { get; set; }
}

 public class CostCentre
{
    public string EmployeeNumber { get; set; }
    public string CostCentreCode { get; set; }
    public string Division { get; set; }
}

Cada SAPMember puede tener uno o más CostCentres.

Este es mi código para poblar inicialmente dos listas independientes (usando Dapper), que luego espero combinar en una lista con una sublista:

    _SAPMembers = new List<SAPMember>();

   string sql = @"SELECT EmployeeNo as EmployeeNumber,
              LastName, FirstName
              FROM Employees";

   _SAPMembers = DbConn.Query<SAPMember>(sql).ToList();

   List<CostCentre> _CostCentres = new List<CostCentre>();

   string sql2 = @"SELECT EmployeeNo as EmployeeNumber, CostCentreCode,
                DivisionDescription as Division
                FROM Employees";

  _CostCentres = DbConn.Query<CostCentre>(sql2).ToList();

He intentado agrupar y unir Linq, etc., pero no puedo obtener la sintaxis correcta, y mi lista _SAPMembers se ha rellenado con los detalles del empleado más una lista relacionada de costcentres.

La muestra de código sería muy apreciada. He visto que esto podría ser posible a partir de una consulta más compleja de Dapper, pero creo que para mi nivel de habilidad, linq podría ser una mejor solución.

Respuesta popular

Como sugirió Amit, podría usar Dapper, así: (nota: cambié la clave de CostCentre a EmpNo)

 if (_SAPMembers == null)

{List _SAPMembers = new List ();

var lookup = new Dictionary<string, SAPMember>();

var result = DbConn.Query<SAPMember, CostCentre, SAPMember>(@"
select DISTINCT e.EmployeeNo as EmployeeNumber, e.LastName, e.FirstName, c.EmployeeNo as EmpNo
, c.CostCentreCode as Name, c.DivisionDescription as Division
FROM EmployeeListing e
join EmployeeListing c on e.EmployeeNo = c.EmployeeNo
where e.TerminationDate is null and c.TerminationDate is null", (e, c) =>
{
    if (!lookup.TryGetValue(e.EmployeeNumber, out SAPMember sapMember))
        lookup.Add(e.EmployeeNumber, sapMember = e);

    if (sapMember.CostCentres == null)
        sapMember.CostCentres = new List<CostCentre>();

    sapMember.CostCentres.Add(c);

    return sapMember;
}, splitOn: "EmpNo");

_SAPMembers = result.Distinct().ToList();

} devolver _SAPMembers;



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué