我有数据表“汽车”,其中有 3 列(车主、汽车类型、颜色)。我的问题是如何通过使用反射使分组部分更加动态。我的想法是将分组 col 添加到数组中,然后在查询分组部分使用反射。然而我对这个反射感到震惊..
var gcols = new string[] { "owner", "carType" };
var reseult = dt.AsEnumerable()
.GroupBy(x => new
{
carType = x.Field<string>("carType"),
colour = x.Field<string>("colour")
})
.Select(x => new
{
CarType = x.Key.carType,
Colour = x.Key.colour,
count = x.Count()
})
.OrderBy(x => x.CarType).ToList();
如果您将此扩展方法添加到对象中:
public static T Field<T>(this object source, string FieldName)
{
var type = source.GetType();
var field = type.GetField(FieldName);
return (T)field.GetValue(source);
}
您可以使用您在代码中发布的语法。
我没有在此处添加任何安全检查,因此需要清理,但它会让您继续前进。理想情况下,您需要检查
field
的类型是否与 T
以及其他一些检查相同。
试试这个:
var gcols = new string[] { "owner", "carType" };
var grouped =dt.AsEnumerable().GroupBy($"new({string.Join(",", gcols )})", "it");
List<List<Customers>> groups = new List<List<Customers>>();
foreach (var item in grouped)
{
var list = (item as Ienumerable<Customer>).ToList();
groups.add(list);
}
如果要分组的列是动态的,则需要检查该键是否存在。
var result = groups
.Select(x => new
{
owner = gcols.Comtains("owner") ? x.first().owner : null,
CarType = gcols.Comtains("carType") ? x.first().carType : null,
Colour = gcols.Comtains("colour") ? x.first().colour : null,
count = x.Count()
})
.OrderBy(x => x.CarType).ToList();