/// <summary> /// Search /// </summary> /// <param name="input"></param> /// <returns></returns> //[AbpAuthorize(PermissionNames.GlobalConfiguration_Users_Read)] public List <DeviceDto> QueryInfoSearch(QueryInfo input) { var obj = new QueryInfo(); var skipNum = input.Skip; var takeNum = input.Take; var query = _deviceRepository.GetAll(); var sorters = input.Sorters; var rules = input.Filter.Rules; var condition = input.Filter.Condition; var parameterEx = Expression.Parameter(typeof(Device), "x"); Expression containsExpression = Expression.Constant(false); Expression currentContainsExpression; Expression result; foreach (var property in input.SearchProperties) { currentContainsExpression = obj.GetBinaryExpression(parameterEx, "ct", property, input.SearchText); containsExpression = Expression.OrElse(containsExpression, currentContainsExpression); } result = obj.GetFilteredList <Device>(parameterEx, rules, condition); result = Expression.AndAlso(containsExpression, result); var whereEx = obj.GetWhere <Device>(result, parameterEx); query = query.Where(whereEx); var sortedFirst = false; foreach (var sort in sorters) { var sortProperty = sort.Property; var sortDirection = sort.Direction; switch (sortDirection) { case "asc": if (!sortedFirst) { query = query.OrderBy(obj.GetOrderByExpression <Device>(sortProperty)); sortedFirst = true; } else { query = ((IOrderedQueryable <Device>)query).ThenBy( obj.GetOrderByExpression <Device>(sortProperty)); } break; case "desc": if (!sortedFirst) { query = query.OrderByDescending(obj.GetOrderByExpression <Device>(sortProperty)); sortedFirst = true; } else { query = ((IOrderedQueryable <Device>)query).ThenByDescending( obj.GetOrderByExpression <Device>(sortProperty)); } break; default: throw new InvalidOperationException(); } } query = query.Skip(skipNum).Take(takeNum); var queryToReturn = ObjectMapper.Map <List <DeviceDto> >(query); return(queryToReturn.ToList()); }