Example #1
0
 public virtual ISqlMakerSelect OrderThen(string columnName, SortAs direction)
 {
     Clauses.Add(Clause.New(ClauseType.ActionSelectOrder, ", ", name: columnName, direction: direction.ToString().ToUpperInvariant()));
     return this;
 }
        /// <summary>
        /// </summary>
        /// <typeparam name="T">Interface type to create and populate</typeparam>
        /// <param name="connection">Open SqlConnection</param>
        /// <param name="where"></param>
        /// <param name="order"></param>
        /// <returns>Entity of T</returns>
        public static IEnumerable <T> GetBy <T>(this IDbConnection connection, object where = null, object order = null, IDbTransaction transaction = null, int?commandTimeout = null) where T : class
        {
            var type       = typeof(T);
            var isUseWhere = where != null;
            var isUseOrder = order != null;

            if (!isUseWhere && !isUseOrder)
            {
                return(GetAll <T>(connection: connection, transaction: transaction, commandTimeout: commandTimeout));
            }
            var whereType = isUseWhere ? where.GetType() : null;
            var orderType = isUseOrder ? order.GetType() : null;
            SqlWhereOrderCache cache;
            var key = GetKeyTypeWhereOrder(type, whereType, orderType);

            if (!GetQueriesWhereOrder.TryGetValue(key, out cache))
            {
                cache = new SqlWhereOrderCache();
                if (isUseWhere)
                {
                    cache.Where = GetListOfNames(whereType.GetProperties());
                }
                if (isUseOrder)
                {
                    cache.Order = GetListOfNames(orderType.GetProperties());
                }
                var           name = GetTableName(type);
                StringBuilder sb   = new StringBuilder();
                sb.AppendFormat("select * from {0}", name);
                int cnt, last, i;
                if (isUseWhere)
                {
                    sb.Append(" where ");
                    cnt  = cache.Where.Count();
                    last = cnt - 1;
                    for (i = 0; i < cnt; i++)
                    {
                        var prop = cache.Where.ElementAt(i);
                        sb.AppendFormat("[{0}]=@{1}", prop, prop);
                        if (i != last)
                        {
                            sb.Append(" and ");
                        }
                    }
                }
                if (isUseOrder)
                {
                    sb.Append(" order by ");
                    cnt  = cache.Order.Count();
                    last = cnt - 1;
                    for (i = 0; i < cnt; i++)
                    {
                        var prop = cache.Order.ElementAt(i);
                        sb.AppendFormat("[{0}] #{1}", prop, prop);
                        if (i != last)
                        {
                            sb.Append(", ");
                        }
                    }
                }

                // TODO: pluralizer
                // TODO: query information schema and only select fields that are both in information schema and underlying class / interface
                cache.Sql = sb.ToString();
                GetQueriesWhereOrder[key] = cache;
            }

            IEnumerable <T> obj      = null;
            var             dynParms = new DynamicParameters();

            if (isUseWhere)
            {
                foreach (string name in cache.Where)
                {
                    dynParms.Add(name, whereType.GetProperty(name).GetValue(where, null));
                }
            }
            if (isUseOrder)
            {
                foreach (string name in cache.Order)
                {
                    SortAs enumVal = (SortAs)orderType.GetProperty(name).GetValue(order, null);
                    switch (enumVal)
                    {
                    case SortAs.Asc:
                        cache.Sql = cache.Sql.Replace("#" + name, "ASC");
                        break;

                    case SortAs.Desc:
                        cache.Sql = cache.Sql.Replace("#" + name, "DESC");
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }
            if (type.IsInterface)
            {
                var res = connection.Query(cache.Sql);
                if (!res.Any())
                {
                    return((IEnumerable <T>)((object)null));
                }
                var objList = new List <T>();
                foreach (var item in res)
                {
                    T objItem = ProxyGenerator.GetInterfaceProxy <T>();

                    foreach (var property in TypePropertiesCache(type))
                    {
                        var val = item[property.Name];
                        property.SetValue(objItem, val, null);
                    }

                    ((IProxy)objItem).IsDirty = false;   //reset change tracking and return
                    objList.Add(objItem);
                }
                obj = objList.AsEnumerable();
            }
            else
            {
                obj = connection.Query <T>(cache.Sql, dynParms, transaction: transaction, commandTimeout: commandTimeout);
            }
            return(obj);
        }
Example #3
0
 public virtual ISqlMakerSelect OrderThen(string columnName, SortAs direction)
 {
     Clauses.Add(Clause.New(ClauseType.ActionSelectOrder, ", ", name: columnName, direction: direction.ToString().ToUpperInvariant()));
     return(this);
 }