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 tablasVMPackageList
,VMPackageItenary
, yVMPackageHighlight
de acuerdo con el campoPackageName
. 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
, yVMPackageHighlight
por separado y luego agrupando los resultados en la claseVMPackageDetails
según el campoPackageName
.Es importante tener en cuenta que en esta consulta LINQ asumimos que cada
PackageName
en las tablasVMPackageList
,VMPackageItenary
, yVMPackageHighlight
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 depackageName
. A continuación, utiliza la cláusulaselect
para crear una nueva instancia deVMPackageDetails
con las propiedadesvmPackage
,vmPackageItenary
yvmPackageHighlights
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