De Efficient data structure to hold employee's activities?, j'ai une liste de type ActividadEmpleado qui est déclarée comme:Comment passer un résultat LINQ à une méthode?
public string Empleado { get; set; }
public DateTime Fecha { get; set; }
public string Actividad { get; set; }
La variable de requête LINQ réordonne le résultat de la manière dont j'ai besoin, ce qui est de stocker par date et par ActividadEmpleado et une chaîne . Cependant, les types var ne peuvent pas être passés aux méthodes, donc en cherchant ce site, je découvre que je dois créer une classe pour stocker les résultats ou modifier la variable LINQ pour retourner une liste, mais j'ai des problèmes avec la déclaration correcte .
La variable LINQ est:
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new
{
Fecha = fecha,
FechaActividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
Visual Studio dit que queryActividades est:
IOrderedEnumerable<'a>
Anonymous Types:
'a new datetime fecha, iorderedenumerable<'b>
'b new IEnumerable<ActividadEmpleado> Actividades, string NombreEmpleado
Je dois passer queryActividades à une autre méthode. J'ai essayé de le passer comme un objet, mais je perds les méthodes d'extension telles que Où <> (puis-je le lancer en quelque sorte?)
Je lis aussi que déclarer les résultats en tant que tuple devrait fonctionner, mais je pense que déclarer un nouveau la classe est plus propre.
Je commence avec LINQ, je l'ai évité d'utiliser des structures de données régulières, mais dans ce cas, il est vraiment utile et je voudrais savoir comment soit gérer des types anonymes en eux ou convertir le résultat à une liste régulière
solution finale:
class GrupoActividad
{
public DateTime Fecha { get; set; }
public IEnumerable<Actividad> Actividades { get; set; }
}
class Actividad
{
public IEnumerable<ActividadEmpleado> Actividades { get; set; }
public string NombreEmpleado { get; set; }
}
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new GrupoActividad
{
Fecha = fecha,
Actividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new Actividad
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
méthode de réception:
var actividades = from a in queryActividades
where a.Fecha == fechaCiclo
select new { a.Fecha, a.Actividades };
foreach (var item in actividades)
{
//cycle that holds each day's activities
foreach (var empleado in item.Actividades)
{
//cycle that holds each employee with activities in that day
foreach (var actividad in empleado.Actividades)
{
//final cycle that actually reads the activity
ActividadEmpleado actividadEmpleado = (ActividadEmpleado)actividad;
}
}
}
'OrderBy (a => a.Fecha) .ToList();'? –
Vous ne pouvez pas passer des types anonymes comme des objets tapés, cela ne fonctionnera pas. Pourquoi ne veux-tu pas utiliser un tuple? –
'var' n'est pas un" type "- il laisse simplement le compilateur déduire ce que le type _actual_ est. –