C# linq group By 字段和结果字符串?

C# linq group By on field and result string?

如何用selectfieldString和resultFieldString写动态groupby? 样本:

       public class Customer
    {
        public int Id;
        public string Name;
        public string LastName;
        public decimal Amount;
    }
var lst = new List<Customer>();
        lst.Add(new Customer { Id = 1, Name = "vahid", LastName = "Aghilpour", Amount = 15 });
        lst.Add(new Customer { Id = 1, Name = "hamid", LastName = "rezaei", Amount = 35 });
        lst.Add(new Customer { Id = 1, Name = "vahid", LastName = "Aghilpour", Amount = 15 });


        string[] field = { "Name", "LastName" };
        string aggrigatefield = "Sum(Amount)";

        lst.GroupBy(field).Select(aggrigatefield);---??????????

通过使用 dynamic linq 你应该可以做到。

// Remember: using System.Linq.Dynamic;
// The format for the key of the GroupBy is "new(field1,field2)"
// "it" as elementSelector means "the full object"
string field = string.Format("new({0})", string.Join(",", fields));
decimal[] res = lst.GroupBy(field, "it")
                   .Select(aggrigatefield)
                   .Cast<decimal>()
                   .ToArray();

请注意,如果 Select 是完全动态的(那么它可以 return 一个 Sum(),或者一个 string 字段,或者一个 decimal 字段, 或一个复杂的对象或一个 ???), 那么你不能真正做一个 Cast<decimal>(), 因为你 "statically" 不知道 returned 对象的类型。你必须做

object[] res = lst.GroupBy(field, "it")
                  .Select(aggrigatefield)
                  .Cast<object>()
                  .ToArray();

dynamic[] res = lst.GroupBy(field, "it")
                  .Select(aggrigatefield)
                  .Cast<dynamic>()
                  .ToArray();