public IQueryable <TElement> CreateQuery <TElement>(Expression expression) { var queryVisitor = new QueryVisitor(_queryVisitor.QueryInfo.Clone()); queryVisitor.Visit(expression); var methodCallExpression = (MethodCallExpression)expression; if (methodCallExpression.Method.Name == "GroupBy") { var dataQueryResult = _dataQuery(queryVisitor.QueryInfo); //if (dataQueryResult is IEnumerable<TElement>) // return ((IEnumerable<TElement>) dataQueryResult).AsQueryable(); if (dataQueryResult is IEnumerable <Grouping> || dataQueryResult is IEnumerable <TElement> ) { var asEls = ((IEnumerable <object>)dataQueryResult).Cast <TElement>(); return(asEls.AsQueryable()); //return (IQueryable<TElement>) ungroupedData.GroupBy((Expression<Func<object, TElement>>)queryVisitor.QueryInfo.GroupBy.KeySelector.Source); //return (IQueryable<TElement>)(object)groupBy; } var ungroupedData = (dataQueryResult as IEnumerable <T>)?.AsQueryable(); if (ungroupedData != null) { if (queryVisitor.QueryInfo.GroupBy.KeyName != null) { return(ungroupedData.GroupBy(queryVisitor.QueryInfo.GroupBy.KeyName).Cast <TElement>()); } } } if (methodCallExpression.Method.Name == "Select") { Func <QueryInfo, object> q = info => ((IEnumerable)_dataQuery(info)).Cast <T>().Select(queryVisitor.Transform <T, TElement>()); return(new DelegateQueryable <TElement>(q, null, queryVisitor)); } return(new DelegateQueryable <TElement>(_dataQuery, expression, queryVisitor)); }