Esempio n. 1
0
        public void Query_ForPocoGivenSqlString_GivenSqlStartingWithDeclare__ShouldReturnValidPocoCollection()
        {
            AddOrders(12);
            var pd  = PocoData.ForType(typeof(Order), DB.DefaultMapper);
            var sql = "DECLARE @@v INT;" +
                      "SET @@v = 1;" +
                      $"SELECT * FROM [{pd.TableInfo.TableName}] WHERE [{pd.Columns.Values.First(c => c.PropertyInfo.Name == "Status").ColumnName}] = @0";

            var results = DB.Query <Order>(sql, OrderStatus.Pending).ToList();

            results.Count.ShouldBe(3);

            results.ForEach(o =>
            {
                o.PoNumber.ShouldStartWith("PO");
                o.Status.ShouldBeOneOf(Enum.GetValues(typeof(OrderStatus)).Cast <OrderStatus>().ToArray());
                o.PersonId.ShouldNotBe(Guid.Empty);
                o.CreatedOn.ShouldBeLessThanOrEqualTo(new DateTime(1990, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                o.CreatedBy.ShouldStartWith("Harry");
            });
        }
Esempio n. 2
0
        public void Query_MultiResultsSet_SingleResultsSetSinglePoco__ShouldReturnValidPocoCollection()
        {
            AddPeople(1, 0);
            var pd  = PocoData.ForType(typeof(Person), DB.DefaultMapper);
            var sql = "SET CONCAT_NULL_YIELDS_NULL ON;" +
                      $"SELECT * FROM [{pd.TableInfo.TableName}] WHERE [{pd.Columns.Values.First(c => c.PropertyInfo.Name == "Name").ColumnName}] LIKE @0 + '%'";

            List <Person> result;

            using (var multi = DB.QueryMultiple(sql, "Peta"))
            {
                result = multi.Read <Person>().ToList();
            }

            result.Count.ShouldBe(1);
            var person = result.First();

            person.Id.ShouldNotBe(Guid.Empty);
            person.Name.ShouldStartWith("Peta");
            person.Age.ShouldBe(18);
        }
Esempio n. 3
0
        //mazq,2011-10-9,增加依据主键集合获取实体集合的方法
        public IEnumerable <T> FetchByPrimaryKeys <T>(IEnumerable <object> primaryKeys)
        {
            if (primaryKeys == null || primaryKeys.Count() == 0)
            {
                return(new List <T>());
            }

            string primaryKeyName = _dbType.EscapeSqlIdentifier(PocoData.ForType(typeof(T)).TableInfo.PrimaryKey);

            StringBuilder sqlBuilder = new StringBuilder("WHERE ");
            int           argIndex   = 0;

            foreach (var primaryKey in primaryKeys)
            {
                sqlBuilder.AppendFormat("{0} = @{1} or ", primaryKeyName, argIndex);
                argIndex++;
            }
            sqlBuilder.Remove(sqlBuilder.Length - 4, 3);

            return(Fetch <T>(sqlBuilder.ToString(), primaryKeys.ToArray()));
        }
Esempio n. 4
0
        protected internal override string GetFromAndJoinOn()
        {
            var dp  = DatabaseProvider.Resolve(_sqlhelper._sqlType);
            var pd1 = PocoData.ForType(typeof(T1));
            var pd2 = PocoData.ForType(typeof(T2));
            var pd3 = PocoData.ForType(typeof(T3));
            var pd4 = PocoData.ForType(typeof(T4));

            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("FROM {0} AS t1 ", dp.GetTableName(pd1, _sqlhelper._tableNameManger));
            if (string.IsNullOrEmpty(on2))
            {
                sb.AppendFormat(",{0} AS t2", dp.GetTableName(pd2, _sqlhelper._tableNameManger));
            }
            if (string.IsNullOrEmpty(on3))
            {
                sb.AppendFormat(",{0} AS t3", dp.GetTableName(pd3, _sqlhelper._tableNameManger));
            }
            if (string.IsNullOrEmpty(on4))
            {
                sb.AppendFormat(",{0} AS t4", dp.GetTableName(pd4, _sqlhelper._tableNameManger));
            }
            if (string.IsNullOrEmpty(on2) == false)
            {
                sb.AppendFormat(" {1} JOIN {0} AS t2 ON {2}", dp.GetTableName(pd2, _sqlhelper._tableNameManger), join2.ToString(), on2);
            }
            if (string.IsNullOrEmpty(on3) == false)
            {
                sb.AppendFormat(" {1} JOIN {0} AS t3 ON {2}", dp.GetTableName(pd3, _sqlhelper._tableNameManger), join3.ToString(), on3);
            }
            if (string.IsNullOrEmpty(on4) == false)
            {
                sb.AppendFormat(" {1} JOIN {0} AS t4 ON {2}", dp.GetTableName(pd4, _sqlhelper._tableNameManger), join4.ToString(), on4);
            }
            sb.Append(" ");
            sb.Append(_joinOnString);
            return(sb.ToString());
        }
Esempio n. 5
0
        public void Query_ForDynamicTypeGivenSqlStringAndParameters_ShouldReturnValidDynamicTypeCollection()
        {
            AddOrders(12);
            var pd  = PocoData.ForType(typeof(Order), DB.DefaultMapper);
            var sql =
                $"SELECT * FROM {DB.Provider.EscapeTableName(pd.TableInfo.TableName)} " +
                $"WHERE {DB.Provider.EscapeSqlIdentifier(pd.Columns.Values.First(c => c.PropertyInfo.Name == "Status").ColumnName)} = @0";

            var results = DB.Query <dynamic>(sql, OrderStatus.Pending);

            results.Count().ShouldBe(3);

            var order = (IDictionary <string, object>)results.First();

            ((string)order[pd.Columns.Values.First(c => c.PropertyInfo.Name == "PoNumber").ColumnName]).ShouldStartWith("PO");
            Convert.ToInt32(order[pd.Columns.Values.First(c => c.PropertyInfo.Name == "Status").ColumnName])
            .ShouldBeOneOf(Enum.GetValues(typeof(OrderStatus)).Cast <int>().ToArray());
            order[pd.Columns.Values.First(c => c.PropertyInfo.Name == "PersonId").ColumnName].ToString().ShouldNotBe(Guid.Empty.ToString());
            ConvertToDateTime(order[pd.Columns.Values.First(c => c.PropertyInfo.Name == "CreatedOn").ColumnName])
            .ShouldBeLessThanOrEqualTo(new DateTime(1990, 1, 1, 0, 0, 0, DateTimeKind.Utc));
            ((string)order[pd.Columns.Values.First(c => c.PropertyInfo.Name == "CreatedBy").ColumnName]).ShouldStartWith("Harry");
        }
Esempio n. 6
0
        /// <summary>
        /// 获取所有实体(仅用于数据量少的情况)
        /// </summary>
        /// <remarks>
        /// 自动对进行缓存(缓存策略与实体配置的缓存策略相同)
        /// </remarks>
        /// <param name="orderBy">排序字段(多个字段用逗号分隔)</param>
        /// <returns>返回按照orderBy排序的所有实体集合</returns>
        public IEnumerable <TEntity> GetAll(string orderBy)
        {
            IEnumerable <object> entityIds = null;
            string cacheKey = null;

            if (RealTimeCacheHelper.EnableCache)
            {
                cacheKey = RealTimeCacheHelper.GetListCacheKeyPrefix(CacheVersionType.GlobalVersion);
                if (!string.IsNullOrEmpty(orderBy))
                {
                    cacheKey += "SB-" + orderBy;
                }

                entityIds = cacheService.Get <IEnumerable <object> >(cacheKey);
            }
            if (entityIds == null)
            {
                PocoData pocoData = PocoData.ForType(typeof(TEntity));

                var sql = PetaPoco.Sql.Builder
                          .Select(pocoData.TableInfo.PrimaryKey)
                          .From(pocoData.TableInfo.TableName);

                if (!string.IsNullOrEmpty(orderBy))
                {
                    sql.OrderBy(orderBy);
                }

                entityIds = CreateDAO().FetchFirstColumn(sql);

                if (RealTimeCacheHelper.EnableCache)
                {
                    cacheService.Add(cacheKey, entityIds, RealTimeCacheHelper.CachingExpirationType);
                }
            }
            IEnumerable <TEntity> entities = PopulateEntitiesByEntityIds(entityIds);

            return(entities);
        }
Esempio n. 7
0
        //mazq,2011-10-8
        /// <summary>
        /// 创建分页的SQL语句
        /// </summary>
        protected void BuildPagingPrimaryKeyQueries <T>(long maxRecords, long skip, long take, string sql, ref object[] args, out string sqlCount, out string sqlPage)
        {
            var pd = PocoData.ForType(typeof(T));

            //libsh,2012-12-05
            string primaryKey = string.Empty;

            if (sql.Contains(pd.TableInfo.TableName))
            {
                primaryKey = pd.TableInfo.TableName + "." + pd.TableInfo.PrimaryKey;
            }
            else
            {
                primaryKey = pd.TableInfo.PrimaryKey;
            }

            if (EnableAutoSelect)
            {
                sql = AutoSelectHelper.AddSelectClause <T>(_dbType, sql, primaryKey);
            }

            BuildPagingPrimaryKeyQueries(maxRecords, skip, take, primaryKey /*libsh,2012-12-05*/, sql, ref args, out sqlCount, out sqlPage);
        }
Esempio n. 8
0
        private static void CreateGetChangesMethod(MethodBuilder getChangesMethod, FieldBuilder fb)
        {
            var pd = PocoData.ForType(typeof(T));
            var il = getChangesMethod.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);               //            IL_0001: ldarg.0
            il.Emit(OpCodes.Ldfld, fb);             //    IL_0002: ldfld class [mscorlib]        System.Collections.Generic.Dictionary`2<string, object> ConsoleApplication1.UserProxy::dict
            il.Emit(OpCodes.Callvirt, clearMethod); //IL_0007: callvirt instance void class [mscorlib]       System.Collections.Generic.Dictionary`2<string, object>::Clear()

            foreach (var item in pd.Columns)
            {
                var pi     = item.PropertyInfo;
                var piType = pi.PropertyType;
                var m      = getEqualsMethod(piType);

                il.Emit(OpCodes.Ldarg_0);                 //                    IL_0054: ldarg.0
                il.Emit(OpCodes.Call, pi.GetGetMethod()); //    IL_0055: call instance class ConsoleApplication1.TestClass ConsoleApplication1.User::get_ss()
                if (piType.IsEnum)
                {
                    il.Emit(OpCodes.Box, piType);
                }
                il.Emit(OpCodes.Ldarg_1);                     //    IL_005a: ldarg.1
                il.Emit(OpCodes.Callvirt, pi.GetGetMethod()); //	IL_005b: callvirt instance class ConsoleApplication1.TestClass ConsoleApplication1.User::get_ss()
                if (piType.IsEnum)
                {
                    il.Emit(OpCodes.Box, piType);
                }
                il.Emit(OpCodes.Ldstr, item.ColumnName); //    IL_0060: ldstr "ss"
                il.Emit(OpCodes.Ldarg_0);                //	IL_0065: ldarg.0
                il.Emit(OpCodes.Ldfld, fb);              //	IL_0066: ldfld class [mscorlib]       System.Collections.Generic.Dictionary`2<string, object> ConsoleApplication1.UserProxy::dict
                il.Emit(OpCodes.Call, m);                //IL_006b: call void ConsoleApplication1.UpdateChangeHelper::EqualsObject(object, object, string, class [mscorlib]      System.Collections.Generic.Dictionary`2<string, object>)
            }
            il.Emit(OpCodes.Ldarg_0);                    //        IL_0054: ldarg.0
            il.Emit(OpCodes.Ldfld, fb);                  //IL_0055: ldfld class [mscorlib]   System.Collections.Generic.Dictionary`2<string, object> ConsoleApplication1.UserProxy::dict
            il.Emit(OpCodes.Ret);
        }
Esempio n. 9
0
        public static string AddSelectClause <T>(IProvider provider, string sql, IMapper defaultMapper)
        {
            if (sql.StartsWith(";"))
            {
                return(sql.Substring(1));
            }

            if (!rxSelect.IsMatch(sql))
            {
                var    pd        = PocoData.ForType(typeof(T), defaultMapper);
                var    tableName = provider.EscapeTableName(pd.TableInfo.TableName);
                string cols      = pd.Columns.Count != 0 ? string.Join(", ", (from c in pd.QueryColumns select tableName + "." + provider.EscapeSqlIdentifier(c)).ToArray()) : "NULL";
                if (!rxFrom.IsMatch(sql))
                {
                    sql = string.Format("SELECT {0} FROM {1} {2}", cols, tableName, sql);
                }
                else
                {
                    sql = string.Format("SELECT {0} {1}", cols, sql);
                }
            }

            return(sql);
        }
Esempio n. 10
0
 public static bool AddRange <T>(this Database db, IEnumerable <T> list) where T : IModel
 {
     if (list == null || list.Count() == 0)
     {
         return(false);
     }
     return(DbFactory.Default
            .InTransaction(() =>
     {
         var flag = true;
         var pd = PocoData.ForType(list.First().GetType());
         foreach (var target in list)
         {
             var model = target as IModel;
             flag = db.Insert(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, pd.TableInfo.AutoIncrement, model).ToBool_();
             model.ModifiedComplete();
             if (!flag)
             {
                 return flag;
             }
         }
         return flag;
     }));
 }
Esempio n. 11
0
 /// <summary>
 /// Get table name
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public string GetTableName(Type t)
 {
     return(_dbType.EscapeSqlIdentifier(PocoData.ForType(t).TableInfo.TableName));
 }
Esempio n. 12
0
        /// <summary>
        /// 把实体entiy更新到数据库
        /// </summary>
        /// <param name="entity">实体</param>
        public virtual void Update(TEntity entity)
        {
            Database dao = CreateDAO();

            int affectedRecords;

            //处理可序列化属性
            if (entity is ISerializableProperties)
            {
                ISerializableProperties extendedProperties = entity as ISerializableProperties;
                if (extendedProperties != null)
                {
                    extendedProperties.Serialize();
                }
            }

            //设置实体正文缓存时如果未给实体正文赋值则不更新
            if (RealTimeCacheHelper.PropertyNameOfBody != null && RealTimeCacheHelper.PropertyNameOfBody.GetValue(entity, null) == null)
            {
                var           pd      = PocoData.ForType(typeof(TEntity));
                List <string> columns = new List <string>();
                foreach (var column in pd.Columns)
                {
                    //去掉主键
                    if (string.Compare(column.Key, pd.TableInfo.PrimaryKey, true) == 0)
                    {
                        continue;
                    }

                    //去掉不允许update的属性
                    if ((SqlBehaviorFlags.Update & column.Value.SqlBehavior) == 0)
                    {
                        continue;
                    }

                    //去掉实体正文
                    if (string.Compare(column.Key, RealTimeCacheHelper.PropertyNameOfBody.Name, true) == 0)
                    {
                        continue;
                    }

                    // Dont update result only columns
                    if (column.Value.ResultColumn)
                    {
                        continue;
                    }

                    columns.Add(column.Key);
                }

                affectedRecords = dao.Update(entity, columns);
            }
            else
            {
                affectedRecords = dao.Update(entity);
            }

            if (affectedRecords > 0)
            {
                OnUpdated(entity);
            }
        }
Esempio n. 13
0
 public PocoData GetPocoDataForType(Type t)
 {
     return(PocoData.ForType(t, DefaultMapper));
 }
Esempio n. 14
0
        public void PD_IncludedResultColumn_InAutoSelect()
        {
            var pd = PocoData.ForType(typeof(PocoWithIncludedResultColumn), new ConventionMapper());

            pd.QueryColumns.ShouldBe(new[] { "RegularProperty", "ResultProperty" });
        }
Esempio n. 15
0
        public static void AppendSQLLog(string userid, Type modelType, params string[] sql)
        {
            var pd = PocoData.ForType(modelType);

            LogDAL.AppendSQLLog(MTConfig.CurrentUserID, pd.TableInfo.TableName);
        }
Esempio n. 16
0
 /// <summary>
 /// 获取表名称
 /// </summary>
 /// <param name="db">数据库实例</param>
 /// <param name="type">实体类型</param>
 /// <returns>转码后的表名</returns>
 public static string GetTableName(this Database db, Type type)
 {
     return(GetTableName(db, PocoData.ForType(type).TableInfo.TableName));
 }
Esempio n. 17
0
        internal TableFix Get <T>()
        {
            var tag = PocoData.ForType(typeof(T)).TableInfo.FixTag;

            return(Get(tag));
        }
Esempio n. 18
0
 /// <summary>
 /// Get Primary key name
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public string GetPrimaryKeyName(Type t)
 {
     return(_dbType.EscapeSqlIdentifier(PocoData.ForType(t).TableInfo.PrimaryKey));
 }
Esempio n. 19
0
        public static string AddSelectClause <T>(DatabaseProvider DatabaseType, string sql, TableNameManger manger)
        {
            if (sql.StartsWith(";"))
            {
                return(sql.Substring(1));
            }
            if (rxSelect.IsMatch(sql))
            {
                return(sql);
            }

            var type          = typeof(T);
            var selectHeaders = selectClause.Get(Tuple.Create(type, DatabaseType), () => {
                var pd        = PocoData.ForType(typeof(T));
                var tableName = DatabaseType.EscapeTableName(pd.TableInfo.TableName);

                StringBuilder sb = new StringBuilder();
                foreach (var col in pd.Columns)
                {
                    if (sb.Length > 0)
                    {
                        sb.Append(",");
                    }

                    if (col.ResultColumn && string.IsNullOrEmpty(col.ResultSql) == false)
                    {
                        sb.AppendFormat(col.ResultSql, tableName + ".");
                        sb.Append(" AS '");
                        sb.Append(col.ColumnName);
                        sb.Append("'");
                    }
                    else
                    {
                        sb.Append(tableName);
                        sb.Append(".");
                        sb.Append(DatabaseType.EscapeSqlIdentifier(col.ColumnName));
                    }
                }
                if (sb.Length == 0)
                {
                    sb.Append("NULL");
                }
                sb.Insert(0, "SELECT ");

                return(sb.ToString());
            });

            StringBuilder s = new StringBuilder();

            s.Append(selectHeaders);

            if (!rxFrom.IsMatch(sql))
            {
                s.Append(" FROM ");
                var tableName2 = DatabaseType.EscapeTableName(PocoData.ForType(typeof(T)).TableInfo.TableName);
                s.Append(tableName2);
            }
            s.Append(" ");
            s.Append(sql);
            return(s.ToString());
        }
Esempio n. 20
0
        private static Delegate CreateDefaultFunction <T>()
        {
            #region 初始时间
            var pd = PocoData.ForType(typeof(T));
            List <PropertyInfo> datetimes       = new List <PropertyInfo>();
            List <PropertyInfo> datetimeoffsets = new List <PropertyInfo>();
            List <PropertyInfo> strings         = new List <PropertyInfo>();
            List <PropertyInfo> ansiStrings     = new List <PropertyInfo>();
            List <PropertyInfo> guids           = new List <PropertyInfo>();
            foreach (var item in pd.Columns)
            {
                if (item.Value.ResultColumn)
                {
                    continue;
                }
                var pi = item.Value.PropertyInfo;
                if (pi.PropertyType == typeof(DateTime))
                {
                    datetimes.Add(pi);
                }
                else if (pi.PropertyType == typeof(DateTimeOffset))
                {
                    datetimeoffsets.Add(pi);
                }
                else if (pi.PropertyType == typeof(string))
                {
                    strings.Add(pi);
                }
                else if (pi.PropertyType == typeof(Guid))
                {
                    guids.Add(pi);
                }
                else if (pi.PropertyType == typeof(AnsiString))
                {
                    ansiStrings.Add(pi);
                }
            }
            #endregion

            #region dateTimeType dateTimeOffsetType AnsiString
            var dateTimeType = typeof(DateTime);
            //var getYear = dateTimeType.GetProperty("Year");
            var getNow         = dateTimeType.GetProperty("Now", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getMinValue    = dateTimeType.GetField("MinValue", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getop_Equality = dateTimeType.GetMethod("op_Equality", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);



            var dateTimeOffsetType = typeof(DateTimeOffset);
            var getNow2            = dateTimeOffsetType.GetProperty("Now", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getMinValue2       = dateTimeOffsetType.GetField("MinValue", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getop_Equality2    = dateTimeOffsetType.GetMethod("op_Equality", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);


            var guidType        = typeof(Guid);
            var getEmpty        = guidType.GetField("Empty", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getNewGuid      = guidType.GetMethod("NewGuid", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            var getop_Equality3 = guidType.GetMethod("op_Equality", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);


            var asctor = typeof(AnsiString).GetConstructor(new Type[] { typeof(string) });

            #endregion

            var m  = new DynamicMethod("toolgood_default_" + Guid.NewGuid().ToString().Replace("-", ""), typeof(void), new Type[] { typeof(T), typeof(bool), typeof(bool), typeof(bool) }, true);
            var il = m.GetILGenerator();

            #region string
            if (strings.Count > 0)
            {
                il.Emit(OpCodes.Ldarg_1);
                var lab1 = il.DefineLabel();
                if (strings.Count < 7)
                {
                    il.Emit(OpCodes.Brfalse_S, lab1);
                }
                else
                {
                    il.Emit(OpCodes.Brfalse, lab1);
                }
                for (int i = 0; i < strings.Count; i++)
                {
                    var item = strings[i];

                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                    var lab = il.DefineLabel();
                    il.Emit(OpCodes.Brtrue_S, lab);


                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldstr, "");
                    il.Emit(OpCodes.Callvirt, item.GetSetMethod());
                    il.MarkLabel(lab);
                }
                il.MarkLabel(lab1);
            }
            #endregion

            #region AnsiString
            if (ansiStrings.Count > 0)
            {
                il.Emit(OpCodes.Ldarg_1);
                var lab1 = il.DefineLabel();
                if (ansiStrings.Count < 7)
                {
                    il.Emit(OpCodes.Brfalse_S, lab1);
                }
                else
                {
                    il.Emit(OpCodes.Brfalse, lab1);
                }

                for (int i = 0; i < ansiStrings.Count; i++)
                {
                    var item = ansiStrings[i];
                    var lab  = il.DefineLabel();

                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                    il.Emit(OpCodes.Brtrue_S, lab);


                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldstr, "");
                    il.Emit(OpCodes.Newobj, asctor);
                    il.Emit(OpCodes.Callvirt, item.GetSetMethod());
                    il.MarkLabel(lab);
                }
                il.MarkLabel(lab1);
            }


            #endregion

            #region date
            if (datetimes.Count + datetimeoffsets.Count > 0)
            {
                il.Emit(OpCodes.Ldarg_2);
                var lab2 = il.DefineLabel();
                if (datetimes.Count + datetimeoffsets.Count < 5)
                {
                    il.Emit(OpCodes.Brfalse_S, lab2);
                }
                else
                {
                    il.Emit(OpCodes.Brfalse, lab2);
                }

                #region datetimes
                foreach (var item in datetimes)
                {
                    var lab = il.DefineLabel();
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                    il.Emit(OpCodes.Ldsfld, getMinValue);
                    il.Emit(OpCodes.Call, getop_Equality);
                    il.Emit(OpCodes.Brfalse_S, lab);

                    il.Emit(OpCodes.Ldarg_0);
                    //il.Emit(OpCodes.Ldsfld, getMinValue);
                    il.Emit(OpCodes.Call, getNow.GetGetMethod());
                    il.Emit(OpCodes.Callvirt, item.GetSetMethod());
                    il.MarkLabel(lab);
                }
                #endregion

                #region datetimeoffsets
                foreach (var item in datetimeoffsets)
                {
                    var lab = il.DefineLabel();
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                    il.Emit(OpCodes.Ldsfld, getMinValue2);
                    il.Emit(OpCodes.Call, getop_Equality2);
                    il.Emit(OpCodes.Brfalse_S, lab);

                    il.Emit(OpCodes.Ldarg_0);
                    //il.Emit(OpCodes.Ldsfld, getMinValue);
                    il.Emit(OpCodes.Call, getNow2.GetGetMethod());
                    il.Emit(OpCodes.Callvirt, item.GetSetMethod());
                    il.MarkLabel(lab);
                }
                #endregion
                il.MarkLabel(lab2);
            }

            #endregion

            #region guid
            if (guids.Count > 0)
            {
                il.Emit(OpCodes.Ldarg_3);
                var lab3 = il.DefineLabel();
                if (guids.Count < 5)
                {
                    il.Emit(OpCodes.Brfalse_S, lab3);
                }
                else
                {
                    il.Emit(OpCodes.Brfalse, lab3);
                }

                foreach (var item in guids)
                {
                    var lab = il.DefineLabel();

                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                    il.Emit(OpCodes.Ldsfld, getEmpty);
                    il.Emit(OpCodes.Call, getop_Equality3);
                    il.Emit(OpCodes.Brfalse_S, lab);

                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Call, getNewGuid);
                    il.Emit(OpCodes.Callvirt, item.GetSetMethod());
                    il.MarkLabel(lab);
                }
                il.MarkLabel(lab3);
            }
            #endregion

            il.Emit(OpCodes.Ret);
            return(m.CreateDelegate(Expression.GetActionType(typeof(T), typeof(bool), typeof(bool), typeof(bool))));
        }
Esempio n. 21
0
 /// <summary>
 /// 获取表名称
 /// </summary>
 /// <param name="db">数据库实例</param>
 /// <param name="type">实体类型</param>
 /// <returns>转码后的表名</returns>
 public static string GetTableName(this IDatabase db, Type type)
 {
     return(GetTableName(db, PocoData.ForType(type, db.DefaultMapper).TableInfo.TableName));
 }
Esempio n. 22
0
 /// <summary>
 /// 格式化列名为:[表名].[列名]
 /// </summary>
 /// <param name="entityType"></param>
 /// <param name="name"></param>
 /// <param name="fromTable"></param>
 /// <returns></returns>
 public static string FormatColumn(Type entityType, string name, out string fromTable)
 {
     //entitytype这里要替换为impletation type
     entityType = DomainMapper.GetImplementType(entityType);
     return(FormatColumn(PocoData.ForType(entityType, new DomainMapper()), name, out fromTable));
 }
Esempio n. 23
0
        public int Count <T>()
        {
            var pd = PocoData.ForType(typeof(T));

            return(Count(pd.TableInfo.TableName));
        }
Esempio n. 24
0
        /// <summary>
        /// 添加
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="db">数据库实例</param>
        /// <param name="entity">要添加的实体</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public static bool Add <T>(this Database db, T entity) where T : new()
        {
            var pd = PocoData.ForType(entity.GetType());

            return(db.Insert(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, false, entity).ToBool_());
        }
Esempio n. 25
0
        /// <summary>
        /// 添加带自增 ID 的实体
        /// </summary>
        /// <typeparam name="T">返回的自增 ID 类型</typeparam>
        /// <param name="db">数据库实例</param>
        /// <param name="entity">要添加的实体</param>
        /// <returns>自增 ID 的值</returns>
        public static T Add <T>(this Database db, object entity)
        {
            var pd = PocoData.ForType(entity.GetType());

            return((T)Convert.ChangeType(db.Insert(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, true, entity), typeof(T)));
        }
Esempio n. 26
0
 protected BaseExecuteTests(DBTestProvider provider)
     : base(provider)
 {
     _pd = PocoData.ForType(typeof(Note), DB.DefaultMapper);
 }
Esempio n. 27
0
        private object VisitMemberAccess(MemberExpression m)
        {
            //if (IsNullableMember(m)) {
            //    m = m.Expression as MemberExpression;
            //}

            if (m.Expression != null &&
                (m.Expression.NodeType == ExpressionType.Parameter || m.Expression.NodeType == ExpressionType.Convert))
            {
                var me = m;
                if (m.Expression.NodeType == ExpressionType.Convert)
                {
                    me = (m.Expression as UnaryExpression).Operand.Reduce() as MemberExpression;
                }

                var p        = me.Expression as ParameterExpression;
                var tableDef = PocoData.ForType(p.Type);
                var colName  = m.Member.Name;

                var col = tableDef.Columns.Where(q => q.Value.PropertyName == colName).Select(q => q.Value).FirstOrDefault();
                if (col != null)
                {
                    colName = col.ColumnName;
                }
                return(new PartialSqlString(colName));
            }
            if (m.Member.DeclaringType == typeof(DateTime) || m.Member.DeclaringType == typeof(DateTime?))
            {
                var m1 = m.Expression as MemberExpression;
                if (m1 != null)
                {
                    var p = Expression.Convert(m1, typeof(object));
                    if (p.NodeType == ExpressionType.Convert)
                    {
                        var pp = m1.Expression as ParameterExpression;
                        if (pp == null)
                        {
                            m1 = m1.Expression as MemberExpression;
                            if (m1 != null)
                            {
                                pp = m1.Expression as ParameterExpression;
                            }
                        }

                        if (pp != null)
                        {
                            string sql = null;
                            switch (m.Member.Name)
                            {
                            case "Year": sql = provider.CreateFunction(SqlFunction.Year, Visit(m1)); break;

                            case "Month": sql = provider.CreateFunction(SqlFunction.Month, Visit(m1)); break;

                            case "Day": sql = provider.CreateFunction(SqlFunction.Day, Visit(m1)); break;

                            case "Hour": sql = provider.CreateFunction(SqlFunction.Hour, Visit(m1)); break;

                            case "Minute": sql = provider.CreateFunction(SqlFunction.Minute, Visit(m1)); break;

                            case "Second": sql = provider.CreateFunction(SqlFunction.Second, Visit(m1)); break;

                            case "Value": return(Visit(m1));

                            //case "HasValue": sql = Visit(m1).ToString() + " IS NOT NULL "; break;
                            default: throw new NotSupportedException("Not Supported " + m.Member.Name);
                            }
                            return(new PartialSqlString(sql));
                        }
                    }
                }
            }

            var member = Expression.Convert(m, typeof(object));
            var lambda = Expression.Lambda <Func <object> >(member);
            var getter = lambda.Compile();

            return(getter());
        }