private static string ResolveQuery(string sql, Query <TResult> query, int pageNumber, out List <QueryTrace.Parameter> parameters, out DynamicParameters queryParams) { string result = sql; List <string> terms = null; parameters = new List <QueryTrace.Parameter>(); var queryProps = QueryUtil.GetProperties(query, sql, out IEnumerable <string> builtInParams); queryParams = new DynamicParameters(); ResolveQueryParams(queryParams, query, queryProps); Dictionary <string, string> whereBuilder = new Dictionary <string, string>() { { InternalStringExtensions.WhereToken, "WHERE" }, // query has no WHERE clause, so it will be added { InternalStringExtensions.AndWhereToken, "AND" } // query already contains a WHERE clause, we're just adding to it }; string token; if (result.ContainsAny(whereBuilder.Select(kp => kp.Key), out token)) { terms = QueryUtil.GetWhereClauseTerms(query, queryProps, builtInParams, parameters, (pi) => $"{query.Db.Syntax.ApplyDelimiter(pi.Name)}=@{pi.Name}"); result = result.Replace(token, (terms.Any()) ? $"{whereBuilder[token]} {string.Join(" AND ", terms)}" : string.Empty); } // need to add built in params explicitly to outgoing param list for the benefit of QueryTrace foreach (var parameter in builtInParams) { var paramProperty = queryProps.Single(pi => pi.Name.ToLower().Equals(parameter)); parameters.Add(new QueryTrace.Parameter() { Name = parameter, Value = paramProperty.GetValue(query) }); } if (pageNumber > 0) { if (query.Db == null) { throw new NullReferenceException("If you use a page number argument with Query, the Db property must be set so that the paging syntax can be applied to the query."); } result = query.Db.Syntax.ApplyPaging(result, pageNumber, query.RowsPerPage); } return(result); }
private static void ResolveQueryParams(DynamicParameters queryParams, object query, IEnumerable <PropertyInfo> queryProps) { foreach (var prop in queryProps) { var value = prop.GetValue(query); if (value != null) { if (prop.HasAttribute <AttachWhereAttribute>()) { var nestedProps = QueryUtil.GetProperties(value, string.Empty, out IEnumerable <string> builtInParams); ResolveQueryParams(queryParams, value, nestedProps); } else { queryParams.Add(prop.Name, value); } } } }