SQL Query to Linq Query Resulta en un objeto complejo

Tengo SQL Query listo, y que quiero su resultado en un complejo objeto SQL. Quiero usar Linq para lograr el resultado.

public class VMPackageList
{
    public string PackageName { get; set; }
    public string ShortTitle { get; set; }  
}

public class VMPackageItenary
{
    public string PackageName { get; set; }
    public string Day { get; set; }
    public string Title { get; set; }
    public string Detail { get; set; }
}

public class VMPackageHighlight
{
    public string PackageName { get; set; }
    public string Highlightname { get; set; }
    public string HighlightDesc { get; set; }
}

El resultado esperado en la clase

public class VMPackageDetails
{
    public VMPackageList vmPackage { get; set; }
    public VMPackageItenary[] vmPackageItenary { get; set; }
    public VMPackageHighlight[] vmPackageHighlights { get; set; }
}

A continuación se encuentra la consulta SQL y su resultado, de la misma manera que quiero entrar Consulta de datos de tabla SQL

Esta es mi consulta de resultados

Había intentado con el siguiente código para lograr pero no tuve éxito

var packages = packageRepository.Table;
            var highlights = packageHighlightRepository.Table;
            var itenaries = packageItenaryRepository.Table;

            var data = (from package in packages
                        join highlight in highlights on package.PackageName equals highlight.PackageName
                        join iteratory in itenaries on package.PackageName equals iteratory.PackageName //&&
                        where package.PackageName == packageName //&& highlight.PackageName equals iteratory.PackageName
                       select new VMPackageDetails
                        {
                            // vmPackage = package
                        }).ToList();

¿Puede alguien ayudarme a conseguir el resultado?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por devepicenter


2 Respuestas:

  • Para lograr el resultado deseado en la clase VMPackageDetails, necesitas utilizar diferentes técnicas en LINQ para agrupar los datos de las tablas VMPackageList, VMPackageItenary, y VMPackageHighlight de acuerdo con el campo PackageName. Aquí te muestro un ejemplo de cómo podrías hacerlo:

    csharp
    var packages = packageRepository.Table.ToList();
    var highlights = packageHighlightRepository.Table.ToList();
    var itenaries = packageItenaryRepository.Table.ToList();
    
    var data = (from package in packages
                where package.PackageName == packageName
                select new VMPackageDetails
                {
                    vmPackage = new VMPackageList
                    {
                        PackageName = package.PackageName,
                        ShortTitle = package.ShortTitle
                    },
                    vmPackageItenary = (from itenary in itenaries
                                        where itenary.PackageName == package.PackageName
                                        select new VMPackageItenary
                                        {
                                            PackageName = itenary.PackageName,
                                            Day = itenary.Day,
                                            Title = itenary.Title,
                                            Detail = itenary.Detail
                                        }).ToArray(),
                    vmPackageHighlights = (from highlight in highlights
                                           where highlight.PackageName == package.PackageName
                                           select new VMPackageHighlight
                                           {
                                               PackageName = highlight.PackageName,
                                               Highlightname = highlight.Highlightname,
                                               HighlightDesc = highlight.HighlightDesc
                                           }).ToArray()
                }).FirstOrDefault();
    

    En este código, estamos realizando una consulta a las tablas VMPackageList, VMPackageItenary, y VMPackageHighlight por separado y luego agrupando los resultados en la clase VMPackageDetails según el campo PackageName.

    Es importante tener en cuenta que en esta consulta LINQ asumimos que cada PackageName en las tablas VMPackageList, VMPackageItenary, y VMPackageHighlight tiene correspondencia entre sí.

    Si necesitas más ayuda o tienes alguna pregunta adicional, ¡no dudes en decírmelo!

    Respondida el Dec 18, 2020 a las 22:17 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Seguro, aquí tienes una consulta LINQ que debería generar el resultado deseado en la clase VMPackageDetails:

    
    var data = from package in packageRepository.Table
              join highlight in packageHighlightRepository.Table on package.PackageName equals highlight.PackageName
              join itenary in packageItenaryRepository.Table on package.PackageName equals itenary.PackageName
              where package.PackageName == packageName
              select new VMPackageDetails
              {
                  vmPackage = new VMPackageList
                  {
                      PackageName = package.PackageName,
                      ShortTitle = package.ShortTitle
                  },
                  vmPackageItenary = (from i in itenary
                                     where i.PackageName == package.PackageName
                                     select new VMPackageItenary
                                     {
                                         PackageName = i.PackageName,
                                         Day = i.Day,
                                         Title = i.Title,
                                         Detail = i.Detail
                                     }).ToArray(),
                  vmPackageHighlights = (from h in highlight
                                        where h.PackageName == package.PackageName
                                        select new VMPackageHighlight
                                        {
                                            PackageName = h.PackageName,
                                            Highlightname = h.Highlightname,
                                            HighlightDesc = h.HighlightDesc
                                        }).ToArray()
              };
    

    Esta consulta se une a las tres tablas en función del campo PackageName y filtra los resultados por el valor de packageName. A continuación, utiliza la cláusula select para crear una nueva instancia de VMPackageDetails con las propiedades vmPackage, vmPackageItenary y vmPackageHighlights rellenas con los datos de las tablas correspondientes.

    Ten en cuenta que he utilizado sintaxis de consulta LINQ implícita para mayor claridad. Si lo prefieres, puedes utilizar sintaxis de consulta LINQ explícita:

    
    var data = packageRepository.Table.Join(
        packageHighlightRepository.Table,
        package => package.PackageName,
        highlight => highlight.PackageName,
        (package, highlight) => new
        {
            Package = package,
            Highlight = highlight
        }).Join(
        packageItenaryRepository.Table,
        ph => ph.Package.PackageName,
        itenary => itenary.PackageName,
        (ph, itenary) => new
        {
            Package = ph.Package,
            Highlight = ph.Highlight,
            Itenary = itenary
        }).Where(x => x.Package.PackageName == packageName).Select(x => new VMPackageDetails
        {
            vmPackage = new VMPackageList
            {
                PackageName = x.Package.PackageName,
                ShortTitle = x.Package.ShortTitle
            },
            vmPackageItenary = x.Itenary.Select(i => new VMPackageItenary
            {
                PackageName = i.PackageName,
                Day = i.Day,
                Title = i.Title,
                Detail = i.Detail
            }).ToArray(),
            vmPackageHighlights = x.Highlight.Select(h => new VMPackageHighlight
            {
                PackageName = h.PackageName,
                Highlightname = h.Highlightname,
                HighlightDesc = h.HighlightDesc
            }).ToArray()
        });
    

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

    Respondida el Dec 18, 2020 a las 22:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0