Пример #1
0
        protected virtual IQueryable <TEntity> BuildQuery(SingleSearchRequest predicates)
        {
            IQueryable <TEntity> returnEnumerable = null;

            if (predicates.Data.Fields != null && predicates.Data.Fields.Any())
            {
                var defaultField      = predicates.Data.Fields.FirstOrDefault().Field;
                var searchExpressions = this.ToExpression(predicates, defaultField);
                foreach (Expression <Func <TEntity, bool> > searchExpression in searchExpressions)
                {
                    returnEnumerable = Queryable.Where <TEntity>(returnEnumerable, searchExpression);
                }
            }
            return(returnEnumerable);
        }
Пример #2
0
 public IQueryable <TEntity> OrderBy(SingleSearchRequest predicates, IQueryable <TEntity> query)
 {
     if (!string.IsNullOrEmpty(predicates.Data.OrderBy))
     {
         var type = typeof(TEntity);
         var prop = type.GetProperties().FirstOrDefault(p => p.Name == predicates.Data.OrderBy);
         if (prop != null)
         {
             var parameter      = Expression.Parameter(type, "p");
             var propertyAccess = Expression.MakeMemberAccess(parameter, prop);
             var orderByExp     = Expression.Lambda(propertyAccess, parameter);
             var resultExp      = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, prop.PropertyType }, query.Expression, Expression.Quote(orderByExp));
             query = query.Provider.CreateQuery <TEntity>(resultExp);
         }
     }
     return(query);
 }
Пример #3
0
        public ListResponse <TEntity> Query(SingleSearchRequest predicates)
        {
            var recordsPerPage = predicates.Data.RecordsPerPage > 0 ? predicates.Data.RecordsPerPage : 20;
            var pageNumber = predicates.Data.PageNumber > 0 ? predicates.Data.PageNumber : 1;
            int totalRecords = 0, totalPages = 0;
            var query = this.BuildQuery(predicates);

            query = this.OrderBy(predicates, query);
            this.Paginate(query, recordsPerPage, out totalPages, out totalRecords);
            query = query.Take(recordsPerPage).Skip(pageNumber);
            var result = query.ToList();

            return(new ListResponse <TEntity>
            {
                Data = result,
                TotalRecords = totalRecords,
                TotalPages = totalPages
            });
        }
Пример #4
0
        public virtual Expression <Func <TEntity, bool> >[] ToExpression(SingleSearchRequest request, string defaultField)
        {
            var result     = new List <Expression <Func <TEntity, bool> > >();
            var properties = typeof(TEntity).GetProperties();

            if (request.Data.SearchType.Equals(SearchType.Default))
            {
                if (string.IsNullOrWhiteSpace(defaultField))
                {
                    throw new ApplicationException("Field not set");
                }

                result.AddRange(ToExpression <String>(defaultField, OperationFilterType.Contem, request.Data.Text,
                                                      string.Empty));
            }
            else
            {
                foreach (FieldData field in request.Data.Fields)
                {
                    var prop = properties.FirstOrDefault(p => p.Name.Equals(field.Field));
                    if (prop == null)
                    {
                        throw new ApplicationException("Field not found " + field.Field);
                    }
                    if (prop.PropertyType == (typeof(Guid)))
                    {
                        result.AddRange(ToExpression <Guid>(field.Field, field.OperationFilter,
                                                            HelperConvert.ToGuid(field.Value1), HelperConvert.ToGuid(field.Value2)));
                    }
                    else if (HelperConvert.IsInteger(prop))
                    {
                        if (prop.PropertyType == typeof(Int64))
                        {
                            result.AddRange(ToExpression <Int64>(field.Field, field.OperationFilter,
                                                                 HelperConvert.ToInt64(field.Value1), HelperConvert.ToInt64(field.Value2)));
                        }
                        if (prop.PropertyType == typeof(Int32))
                        {
                            result.AddRange(ToExpression <Int32>(field.Field, field.OperationFilter,
                                                                 HelperConvert.ToInt32(field.Value1), HelperConvert.ToInt32(field.Value2)));
                        }
                        else
                        {
                            result.AddRange(ToExpression <int>(field.Field, field.OperationFilter,
                                                               HelperConvert.ToInt(field.Value1), HelperConvert.ToInt(field.Value2)));
                        }
                    }
                    else if (HelperConvert.IsNullableInteger(prop))
                    {
                        result.AddRange(ToExpression <int?>(field.Field, field.OperationFilter,
                                                            HelperConvert.ToInt(field.Value1), HelperConvert.ToInt(field.Value2)));
                    }
                    else if (prop.PropertyType == (typeof(DateTime)))
                    {
                        var dt1 = HelperConvert.ToDateTimeBr(field.Value1);
                        var dt2 = HelperConvert.ToDateTimeBr(field.Value2);
                        result.AddRange(ToExpression <DateTime>(field.Field, field.OperationFilter, dt1, dt2));
                    }
                    else if (prop.PropertyType == (typeof(DateTime?)))
                    {
                        var dt1 = HelperConvert.ToDateTimeBr(field.Value1);
                        var dt2 = HelperConvert.ToDateTimeBr(field.Value2);
                        result.AddRange(ToExpression <DateTime?>(field.Field, field.OperationFilter, dt1, dt2));
                    }
                    else if (prop.PropertyType == (typeof(decimal)))
                    {
                        result.AddRange(ToExpression <decimal>(field.Field, field.OperationFilter,
                                                               HelperConvert.ToDecimal(field.Value1), HelperConvert.ToDecimal(field.Value2)));
                    }
                    else if (prop.PropertyType == (typeof(decimal?)))
                    {
                        result.AddRange(ToExpression <decimal?>(field.Field, field.OperationFilter,
                                                                HelperConvert.ToNullableDecimal(field.Value1), HelperConvert.ToNullableDecimal(field.Value2)));
                    }
                    else if (prop.PropertyType == (typeof(Boolean)))
                    {
                        result.AddRange(ToExpression <Boolean>(field.Field, field.OperationFilter,
                                                               HelperConvert.ToBoolean(field.Value1), HelperConvert.ToBoolean(field.Value2)));
                    }
                    else if (prop.PropertyType == (typeof(Boolean?)))
                    {
                        result.AddRange(ToExpression <Boolean?>(field.Field, field.OperationFilter,
                                                                HelperConvert.ToBoolean(field.Value1), HelperConvert.ToBoolean(field.Value2)));
                    }

                    else if (prop.PropertyType == (typeof(byte)))
                    {
                        result.AddRange(ToExpression <byte>(field.Field, field.OperationFilter,
                                                            ToByte(field.Value1), ToByte(field.Value2)));
                    }
                    else if (prop.PropertyType == (typeof(byte?)))
                    {
                        result.AddRange(ToExpression <byte?>(field.Field, field.OperationFilter,
                                                             ToByte(field.Value1), ToByte(field.Value2)));
                    }

                    else
                    {
                        result.AddRange(ToExpression <string>(field.Field, field.OperationFilter, field.Value1,
                                                              field.Value2));
                    }
                }
            }
            return(result.ToArray());
        }