Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }