Пример #1
0
        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);
        }
Пример #2
0
 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);
             }
         }
     }
 }