public virtual IEnumerable <T> Find(Expression <Func <T, bool> > predicate)
        {
            IEnumerable <T> items = null;

            if (items == null || items.Count() == 0)
            {
                // extract the dynamic sql query and parameters from predicate
                QueryResult result = DynamicQuery.GetDynamicQuery <T>(this.tableName, predicate);
                using (DbConnection cn = this.Connection)
                {
                    cn.Open();
                    items = cn.Query <T>(result.Sql, (object)result.Param);
                }
            }

            if (items != null && items.Count() > 0)
            {
                items = items.Where(predicate.Compile());
            }

            return(items);
        }
 /// <summary>
 /// This method is used to construct the update statement based on the entity type.
 /// </summary>
 /// <typeparam name="T">Represents entity Type</typeparam>
 /// <param name="cnn">Represents SQL connection object</param>
 /// <param name="tableName">Name of the table which update statement performs</param>
 /// <param name="param">Represents Parameters collection</param>
 public static void Update(this DbConnection cnn, string tableName, dynamic param)
 {
     SqlMapper.Execute(cnn, DynamicQuery.GetUpdateQuery(tableName, param), param);
 }
        /// <summary>
        /// This method is used to construct the insert statement based on the entity type.
        /// </summary>
        /// <typeparam name="T">Represents entity Type</typeparam>
        /// <param name="cnn">Represents SQL connection object</param>
        /// <param name="tableName">Name of the table which insert statement performs</param>
        /// <param name="param">Represents Parameters collection</param>
        /// <returns>Primary key</returns>
        public static T Insert <T>(this DbConnection cnn, string tableName, dynamic param)
        {
            IEnumerable <T> result = SqlMapper.Query <T>(cnn, DynamicQuery.GetInsertQuery(tableName, param), param);

            return(result.First());
        }