public static IQueryable GetGroupKeyCounts <T>(IQueryable <T> pQueryable, IEnumerable <IMPropertyInfo> pProperties) { var anType = MGridGroupByAnonymousTypeHelper.GetAnonymousType(pProperties); ParameterExpression parameter = Expression.Parameter(typeof(T), "t"); List <MemberBinding> bindings = new List <MemberBinding>(); foreach (var property in pProperties) { var field = anType.GetProperty(property.Name); var exprBind = Expression.Bind(field, property.GetMemberExpression(parameter)); bindings.Add(exprBind); } Expression selector = Expression.Lambda(Expression.MemberInit(Expression.New(anType.GetConstructor(Type.EmptyTypes)), bindings), parameter); var miGroupBy = GroupByMethod.MakeGenericMethod(new[] { typeof(T), anType }); var groupedQueryable = (IEnumerable)miGroupBy.Invoke(null, new object[] { pQueryable, selector }); var igroupType = groupedQueryable.GetType().GenericTypeArguments.First(); ParameterExpression parameterGrouped = Expression.Parameter(igroupType, "t"); var keyprop = Expression.PropertyOrField(parameterGrouped, "Key"); var miCount = CountMethod.MakeGenericMethod(new[] { typeof(T) }); var countprop = Expression.Call(miCount, new[] { parameterGrouped }); var tupleGenericType = Type.GetType($"System.Tuple`2"); var keyPropertyTypes = new[] { anType, typeof(int) }; var tupleType = tupleGenericType.MakeGenericType(keyPropertyTypes); var tupleConstructor = tupleType.GetConstructor(keyPropertyTypes); var newTupleExpression = Expression.New(tupleConstructor, new Expression[] { keyprop, countprop }); var lambda = Expression.Lambda(newTupleExpression, new[] { parameterGrouped }); var miSelect = SelectMethod.MakeGenericMethod(new[] { igroupType, tupleType }); var groupSelectedQueryable = miSelect.Invoke(null, new object[] { groupedQueryable, lambda }); return((IQueryable)groupSelectedQueryable); }
public static long GetDataCount(IQueryable pKeyObjects, IDictionary <string, object>[] hiddenGroupByKeys) { long total = 0; foreach (dynamic tuple in pKeyObjects) { object keyObj = tuple.Item1; if (hiddenGroupByKeys.Any(h => MGridGroupByAnonymousTypeHelper.AnonymousTypeContainsAllOfDictionary(keyObj, h))) { continue; } int count = tuple.Item2; total += count; } return(total); }
public static IEnumerable <MGridGroupByHelperKeyInfo> GetKeys(IQueryable pKeyCounts, long pSkip, int?pTake, IDictionary <string, object>[] hiddenGroupByKeys) { long currentIndex = 0; List <MGridGroupByHelperKeyInfo> keys = new List <MGridGroupByHelperKeyInfo>(); long?rowsMissing = pTake; var skip = pSkip; foreach (dynamic entry in pKeyCounts) { var dynamicKeyType = entry.Item1; long countInGroupPart = entry.Item2; currentIndex += countInGroupPart; // var properties = (IEnumerable<PropertyInfo>)dynamicKeyType.GetType().GetProperties(); // var values = properties.Select(p => p.GetValue(dynamicKeyType)).ToArray(); var hiddenDict = hiddenGroupByKeys.FirstOrDefault(h => MGridGroupByAnonymousTypeHelper.AnonymousTypeContainsAllOfDictionary(dynamicKeyType, h)); if (hiddenDict != null) { skip += countInGroupPart; if (currentIndex >= skip) { // var keyValues = MGridGroupByAnonymousTypeHelper.GetKeyValues(dynamicKeyType, hiddenDict.Count); keys.Add(new MGridGroupByHelperKeyInfo() { DynamicKeyObj = dynamicKeyType, Offset = 0, Take = 0 }); } continue; } if (rowsMissing.HasValue && rowsMissing <= 0) { break; } if (currentIndex > skip) { if (rowsMissing.HasValue) { var offset = Math.Max(0, skip - (currentIndex - countInGroupPart)); long entryCount = (countInGroupPart - offset); long take = rowsMissing.Value; if (take > entryCount) { take = entryCount; } keys.Add(new MGridGroupByHelperKeyInfo() { DynamicKeyObj = dynamicKeyType, Offset = offset, Take = take }); rowsMissing -= take; } else { keys.Add(new MGridGroupByHelperKeyInfo() { DynamicKeyObj = dynamicKeyType, Offset = 0, Take = countInGroupPart }); } } } return(keys); }