使用反射的Linq组

问题描述 投票:0回答:2

我有数据表“汽车”,其中有 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();
c# linq data-structures system.reflection
2个回答
1
投票

如果您将此扩展方法添加到对象中:

    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
以及其他一些检查相同。


0
投票

试试这个:

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();
© www.soinside.com 2019 - 2024. All rights reserved.