private Expression ConstructWhereExpr(ParameterExpression startParam, QueryRequestParam param) { Expression expr = Expression.Constant(true); int idx = 0; foreach (var filter in param.Filters) { if (!ValidateField(startParam, filter.FieldName)) { continue; } Expression e = null; var func = QueryExpression.GetExprDelegate(filter.Operator); e = func(startParam, filter.FieldName, filter.Value); if (idx == 0) { expr = e; } else { expr = Expression.And(expr, e); } idx++; } return(expr); }
private void InitPageLimit(QueryRequestParam param) { int pageSize = param.PageSize; limit = pageSize; if (limit > maxPageLimit) { limit = maxPageLimit; LogUtils.LogWarning(GetLogger(), "Adjusted page size from [{0}] to [{1}]!!!]", pageSize, limit); } if (limit <= 0) { limit = maxPageLimit; LogUtils.LogWarning(GetLogger(), "Adjusted page size from [{0}] to [{1}]!!!]", pageSize, limit); } }
protected bool GetListOperationWithNoParameter <T>(string db, string provider, TestOperationParam param) where T : BaseModel { CreateOnixDbContext(db, provider); bool ok = true; var opr = CreateGetListOperation(param.GetListName); try { QueryRequestParam qrp = new QueryRequestParam(); QueryResponseParam response = opr.Apply(qrp); } catch { ok = false; } return(ok); }
public QueryResponseParam Apply(QueryRequestParam param) { InitPageLimit(param); queryParam = param; context = GetDatabaseContext(); Type mt = GetModelType(); ParameterExpression startParam = Expression.Parameter(mt); var expr = ConstructWhereExpr(startParam, param); int totalRec = GetTotalRecord(startParam, expr); QueryResponseParam qrp = new QueryResponseParam(); qrp.Results = new List <BaseModel>(); var results = Query(startParam, expr); results = ApplyOrderBy(results, mt, param); if (param.ByChunk) { results = ApplyLimitOffset(results, param); qrp.PageNo = param.PageNo; } foreach (var r in results) { qrp.Results.Add(r); } qrp.RecordCount = qrp.Results.Count; qrp.TotalRecord = totalRec; qrp.TotalPage = GetTotalPage(totalRec); return(qrp); }
protected QueryResponseParam GetListOperationWithParameter <T>(string db, string provider, TestOperationParam param, QueryRequestParam qrp) where T : BaseModel { QueryResponseParam response = null; var opr = CreateGetListOperation(param.GetListName); response = opr.Apply(qrp); return(response); }
private IQueryable <BaseModel> ApplyOrderBy(IQueryable <BaseModel> query, Type type, QueryRequestParam param) { var expression = query.Expression; int cnt = 0; foreach (var order in param.OrderBy) { var parameter = Expression.Parameter(type, "m"); string command = GetOrderCommand(cnt, order.Order); var property = type.GetProperty(order.FieldName); if (property == null) { LogUtils.LogWarning(GetLogger(), "Property [{0} not found!!!]", order.FieldName); continue; } var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExpression = Expression.Lambda(propertyAccess, parameter); expression = Expression.Call( typeof(Queryable), command, new Type[] { type, property.PropertyType }, expression, orderByExpression); cnt++; } return(query.Provider.CreateQuery <BaseModel>(expression)); }
private IQueryable <BaseModel> ApplyLimitOffset(IQueryable <BaseModel> query, QueryRequestParam param) { int currentChunk = param.PageNo; if (currentChunk <= 0) { currentChunk = 1; } int offset = ((currentChunk - 1) * limit); var qr = query.Skip(offset).Take(limit); return(qr); }