使用
string[] group = new string[] { "Agencename", "Agencegroupname", "Agenceregionname", "Reportproducyname", "Reportsalestyle" };
var query = data1.DynamicGroupBy(group).ToList();
var sdata2 = data1.DynamicGroupBy(group).Select(s => new Returndetail
{
Agencename = s.Key[0].ToString(),
Agencegroupname = s.Key[1].ToString(),
Agenceregionname = s.Key[2].ToString(),
Name = s.Key[3].ToString(),
Reportsalestyle = s.Key[4].ToString(),
Gold = s.Sum(y => y.Gold),
Lableprice = s.Sum(y => y.Lableprice),
Num = s.Sum(y => y.Num),
Receivedprice = s.Sum(y => y.Receivedprice),
Settleprice = s.Sum(y => y.Settleprice)
}).OrderByDescending(s => s.Num).ToList();
自定义class
public static class LinqExt
{
public class DGroupBy<T> : IGrouping<object[], T>
{
private List<T> _innerlist = new List<T>();
private object[] _key;
public DGroupBy(object[] key) { _key = key; }
public object[] Key
{
get { return _key; }
}
public void Add(T value)
{
_innerlist.Add(value);
}
public IEnumerator<T> GetEnumerator()
{
return this._innerlist.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this._innerlist.GetEnumerator();
}
}
public static IEnumerable<IGrouping<object[], T>> DynamicGroupBy<T>(this IEnumerable<T> data, string[] keys)
{
List<DGroupBy<T>> list = new List<DGroupBy<T>>();
foreach (var item in data.Select(x => new
{
k = keys.Select(y => x.GetType().GetProperty(y).GetValue(x, null)).ToArray(),
v = x
}))
{
DGroupBy<T> existing = list.SingleOrDefault(x => x.Key.Zip(item.k, (a, b) => a.Equals(b)).All(y => y));
if (existing == null)
{
existing = new DGroupBy<T>(item.k);
list.Add(existing);
}
existing.Add(item.v);
}
return list;
}
}