C# 如何将LINQ结果传递给方法?
从中,我有一个ActividaTempleado类型的列表,声明为:C# 如何将LINQ结果传递给方法?,c#,linq,data-structures,anonymous-types,C#,Linq,Data Structures,Anonymous Types,从中,我有一个ActividaTempleado类型的列表,声明为: public string Empleado { get; set; } public DateTime Fecha { get; set; } public string Actividad { get; set; } LINQ查询变量按照我需要的方式对结果进行重新排序,即按日期存储,然后按ActivityTempleado和字符串存储。但是,var类型不能传递给方法,因此在搜索这个站点时,我发现我需要创建一个类来存储结果
public string Empleado { get; set; }
public DateTime Fecha { get; set; }
public string Actividad { get; set; }
LINQ查询变量按照我需要的方式对结果进行重新排序,即按日期存储,然后按ActivityTempleado和字符串存储。但是,var类型不能传递给方法,因此在搜索这个站点时,我发现我需要创建一个类来存储结果,或者修改LINQ变量以返回列表,但是我在正确的声明方面遇到了问题
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说queryActividades是:
IOrderedEnumerable<'a>
Anonymous Types:
'a new datetime fecha, iorderedenumerable<'b>
'b new IEnumerable<ActividadEmpleado> Actividades, string NombreEmpleado
不能在方法之间传递匿名类型;如果需要将数据传递给另一个方法,则需要创建一个包含
Actividades
和NombreEmpleado
属性的显式命名类型,以及另一个包含Fecha
和FechaActividades
的类型。现在,您正在创建一个基于匿名类型的集合(实际上是两个匿名类型),实际上不能传递给另一个方法(除了使用反射或动态
)
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;}
}
并将其作为
IEnumerable
传递。您可以使用D Stanley提出的方法。但是,为将来编写的任何类似查询创建此类类将有点枯燥。相反,您可以将其作为泛型类引入,如下所示
public class Grouping<TKey, TElement>
{
public TKey Key { get; set; }
public IEnumerable<TElement> Elements { get; set; }
}
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);
像这样使用它
public class Grouping<TKey, TElement>
{
public TKey Key { get; set; }
public IEnumerable<TElement> Elements { get; set; }
}
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);
OrderBy(a=>a.Fecha).ToList();
?不能传递类型化对象之类的匿名类型,这是行不通的。为什么不使用元组?var
不是“类型”-它只是让编译器推断出实际的类型。再加上@YuvalItzchakov,如果你在查询中将它们分组为一个自定义类型,那么你就有了一个IEnumerable
?@DStanley我认为他不是指var
类型。他是指他为GroupBy
创建的匿名类型。他没有这样做o将ActivityGroup中的字符串Fecha更改为DateTime Fecha,也将FechaActividades重命名为Activities(LINQ定义的第5行),但在编译时仍会出现错误:无法将ActividaDeSampleADO转换为Actividades(第8行),也无法将NombreImpleADO转换为NombreImpleADO(第9行)。我应该删除类中的IEnumerable类型吗?@fjleon请尝试我的编辑-我反向获取了内部类型的类型。并且您确实需要IEnumerable
,因为属性表示集合。仍然存在错误:无法隐式将类型“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.IEnumerable”。另外,line 8应该说FechaActividades,而不是Actividades。请参阅我编辑的问题,接收queryActividad的方法应该能够应用where子句,因为shownI必须在我上次编辑之前的注释后重命名接收方法中的属性。现在它确实起作用了。我将用解决方案更新问题。谢谢!ve有趣的是,我会研究这个问题并将其保存在某个地方:D,现在DStanley的解决方案(经过一个小的更改)运行良好。也许我会更改它,我喜欢较短的代码:)@fjleon没关系,我在写上述内容时就知道DStanley的解决方案很好,但既然你说你从LINQ开始,决定努力为你提供一个选择。很高兴你觉得它很有趣,所以付出的努力是值得的:-)干杯。
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);