如何将LINQ结果传递给方法
本文关键字:方法 结果 LINQ | 更新日期: 2023-09-27 18:22:33
从高效的数据结构到留住员工';s的活动,我有一个ActivitadEmpleado类型的列表,声明为:
public string Empleado { get; set; }
public DateTime Fecha { get; set; }
public string Actividad { get; set; }
LINQ查询变量按照我需要的方式对结果进行重新排序,即按日期存储,然后按ActivitadEmpreado和字符串存储。然而,var类型不能传递给方法,所以在这个网站上搜索时,我发现我要么需要创建一个类来存储结果,要么需要修改LINQ变量来返回List,但我在正确的声明方面遇到了问题。
LINQ变量为:
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说queryActivitidades是:
IOrderedEnumerable<'a>
Anonymous Types:
'a new datetime fecha, iorderedenumerable<'b>
'b new IEnumerable<ActividadEmpleado> Actividades, string NombreEmpleado
我需要将queryActivitidades传递给另一个方法。我尝试将其作为Object传递,但随后我丢失了扩展方法,如Where<>(我能以某种方式铸造它吗?)
我还读到将结果声明为元组应该有效,但我认为声明一个新类更干净。
我刚开始使用LINQ,我避免使用常规数据结构,但在这种情况下,它确实很有帮助,我想知道如何处理其中的匿名类型或将结果转换为常规列表
最终解决方案:
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);
接收方式:
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;
}
}
}
现在您正在创建一个基于匿名类型(实际上是两个匿名类型)的集合,该集合实际上无法传递给另一个方法(除了使用反射或dynamic
)。最干净的方法是创建一个表示集合的具体类型,比如
public class ActivityGroup
{
public DateTime Fecha {get; set;}
public IEnumerable<Activity> Activities {get; set;}
}
public class Activity
{
public IEnumerable<Activity> Actividades {get; set;}
public string NombreEmpleado {get; set;}
}
然后将您的查询更改为:
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new ActivityGroup
{
Fecha = fecha,
FechaActividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new Activity
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
并将其作为IEnumerable<ActivityGroup>
传递
您可以使用D Stanley提出的方法。但是,必须为将来编写的任何类似查询创建这样的类会有点无聊。相反,您可以将其作为泛型类引入,比如这个
public class Grouping<TKey, TElement>
{
public TKey Key { get; set; }
public IEnumerable<TElement> Elements { get; set; }
}
并使用它来代替像这样的匿名类型
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new Grouping<DateTime, Grouping<string, ActividadEmpleado>>
{
Key = fecha,
Elements = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new Grouping<string, ActividadEmpleado>
{
Key = nombreEmpleado,
Elements = actividadesEmpleado
})
.OrderBy(a => a.Key)
})
.OrderBy(a => a.Key);
其可以作为CCD_ 3传递。
正如您所看到的,在可重用性和可读性之间存在着一种折衷。基本上,这是一个Tuple
,有一些更有意义的名称。请注意,尽管我们无法提高结果中的详细程度,但我们可以使用与Tuple.Create
类似的技术,通过添加类似于的类来删除查询中的详细内容
public static class Grouping
{
public static Grouping<TKey, TElement> Create<TKey, TElement>(TKey key, IEnumerable<TElement> elements)
{
return new Grouping<TKey, TElement> { Key = key, Elements = elements };
}
}
并像这个一样使用它
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => Grouping.Create(
fecha, fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => Grouping.Create(
nombreEmpleado, actividadesEmpleado))
.OrderBy(a => a.Key)))
.OrderBy(a => a.Key);
不能在方法之间传递匿名类型;如果需要将数据传递给另一个方法,则需要创建一个包含Actividades
和NombreEmpleado
属性的显式命名类型,以及另一个具有Fecha
和FechaActividades
的类型。