예제 #1
0
        public static async Task <TResult> FirstOrDefaultAsync <TResult>(this FilteredExpressionQuery <TResult> filteredExpressionQuery) where TResult : class
        {
            object obj = await filteredExpressionQuery.ToObjectQuery(filteredExpressionQuery.Source).FirstOrDefaultAsync();

            filteredExpressionQuery.ClearInterceptors(obj);

            return((TResult)obj);
        }
예제 #2
0
        public static async Task <List <TResult> > ToListAsync <TResult>(this FilteredExpressionQuery <TResult> filteredExpressionQuery, IQueryable <TResult> query) where TResult : class
        {
            IQueryable <object> runtimeTypeSelectExpressionQuery = filteredExpressionQuery.ToObjectQuery(query);

            // Get result from database
            List <object> listOfObjects = await runtimeTypeSelectExpressionQuery.ToListAsync();

            MethodInfo castMethod = typeof(Queryable)
                                    .GetMethod("Cast", BindingFlags.Public | BindingFlags.Static)
                                    .MakeGenericMethod(filteredExpressionQuery.ProxyType);

            // Cast list<objects> to IQueryable<runtimeType>
            IQueryable castedSource = castMethod.Invoke(
                null,
                new Object[] { listOfObjects.AsQueryable() }
                ) as IQueryable;

            // Create instance of runtime type parameter
            ParameterExpression runtimeParameter = Expression.Parameter(filteredExpressionQuery.ProxyType, "p");

            IDictionary <string, PropertyInfo> dynamicTypeFieldsDict =
                filteredExpressionQuery.ProxyProperties.ToDictionary(f => f.Name.ToLowerInvariant(), f => f);

            // Generate bindings from runtime type to source type
            IEnumerable <MemberBinding> bindingsToTargetType = filteredExpressionQuery.SelectedProperties.Values
                                                               .Select(property => Expression.Bind(
                                                                           property,
                                                                           Expression.Property(
                                                                               runtimeParameter,
                                                                               dynamicTypeFieldsDict[property.Name.ToLowerInvariant()]
                                                                               )
                                                                           ));

            // Generate projection trom runtimeType to T and cast as IQueryable<object>
            IQueryable <TResult> targetTypeSelectExpressionQuery
                = ExpressionMapper.GenerateProjectedQuery <TResult>(
                      filteredExpressionQuery.ProxyType,
                      typeof(TResult),
                      bindingsToTargetType,
                      castedSource,
                      runtimeParameter
                      );

            // Return list of T
            return(targetTypeSelectExpressionQuery.ToList());
        }
예제 #3
0
        public static async Task <IPage <TResult> > ToPageAsync <TResult>(this FilteredExpressionQuery <TResult> filteredExpressionQuery, PagedRequest request) where TResult : class
        {
            if (request == null)
            {
                throw new PagingException($"You need to initialize a paging request before paging on a list. The parameter request should be initialized.");
            }

            if (!request.Page.HasValue)
            {
                if (!string.IsNullOrEmpty(request.OrderBy))
                {
                    if (request.Order == OrderType.Asc)
                    {
                        filteredExpressionQuery.Source = filteredExpressionQuery.Source.OrderBy(request.OrderBy);
                    }
                    else if (request.Order == OrderType.Desc)
                    {
                        filteredExpressionQuery.Source = filteredExpressionQuery.Source.OrderBy(request.OrderBy + " descending");
                    }
                }

                return(new Page <TResult>(await ToListAsync(filteredExpressionQuery), 0, 0, 0));
            }

            if (String.IsNullOrEmpty(request.OrderBy))
            {
                throw new PagingException($"In order to use paging extensions you need to supply an OrderBy parameter.");
            }

            if (request.Order == OrderType.Asc)
            {
                filteredExpressionQuery.Source = filteredExpressionQuery.Source.OrderBy(request.OrderBy);
            }
            else if (request.Order == OrderType.Desc)
            {
                filteredExpressionQuery.Source = filteredExpressionQuery.Source.OrderBy(request.OrderBy + " descending");
            }

            int skip           = (request.Page.Value - 1) * request.PageSize.Value;
            int take           = request.PageSize.Value;
            int totalItemCount = await filteredExpressionQuery.Source.CountAsync();

            return(new Page <TResult>(await ToListAsync(filteredExpressionQuery, filteredExpressionQuery.Source.Skip(skip).Take(take)), request.Page.Value, request.PageSize.Value, totalItemCount));
        }
예제 #4
0
 public static async Task <List <TResult> > ToListAsync <TResult>(this FilteredExpressionQuery <TResult> filteredExpressionQuery) where TResult : class
 {
     return(await ToListAsync(filteredExpressionQuery, filteredExpressionQuery.Source));
 }