示例#1
0
 private void AssignPropertyViewModels(List <ReflectionJoinTable> joinTables,
                                       IDictionary viewModelDic)
 {
     foreach (var joinTable in joinTables)
     {
         foreach (DictionaryEntry row in viewModelDic)
         {
             if (joinTable.IsInverse)
             {
                 var id    = row.Key;
                 var value = joinTable.ReflectionTable.ViewModelDic[id];
                 PropertyReflectionHelper.SetPropertyValue(row.Value, value,
                                                           joinTable.Property);
             }
             else
             {
                 var isOntoMany = row.Value is IEnumerable;
                 if (!isOntoMany)
                 {
                     var id = PropertyReflectionHelper.GetPropValue(row.Value, joinTable.ForeignKey);
                     if (id != null)
                     {
                         var value = joinTable.ReflectionTable.ViewModelDic[id];
                         PropertyReflectionHelper.SetPropertyValue(row.Value, value,
                                                                   joinTable.Property);
                     }
                 }
                 else
                 {
                     var obj = (IList)row.Value;
                     foreach (var instance in obj)
                     {
                         var id = PropertyReflectionHelper.GetPropValue(instance, joinTable.ForeignKey);
                         if (id != null)
                         {
                             var value = joinTable.ReflectionTable.ViewModelDic[id];
                             PropertyReflectionHelper.SetPropertyValue(instance, value,
                                                                       joinTable.Property);
                         }
                     }
                 }
             }
         }
     }
 }
示例#2
0
        /// <summary>
        /// گرفتن ساختار لیست پیوندی
        /// </summary>
        /// <returns>خروجی به صورت لیست پیوندی</returns>
        internal ReflectionTable GetReflectionTable(Type type)
        {
            var tableName = type.GetTypeInfo().GetCustomAttribute <TableAttribute>().Name;
            var result    = new ReflectionTable()
            {
                TableName  = tableName,
                PrimaryKey = PropertyReflectionHelper.GetPrimaryKeyNameAndType(type),
                UniqName   = GetUniqName(tableName)
            };

            // گرفتن پراپرتی های ویو مدل برای ساختن جدول
            var properties = type.GetProperties();

            foreach (var prop in properties)
            {
                bool notMappedProp = Attribute.IsDefined(prop, typeof(NotMappedAttribute));

                // اگر پراپرتی نمایشی باشد درنظر نگیر
                if (!prop.CanWrite || notMappedProp)
                {
                    continue;
                }
                // اگر از نوع جوین نباشد نامش را بر میداریم
                var joinProp            = prop.GetCustomAttribute <JoinAttribute>();
                var invertAttr          = prop.GetCustomAttribute <InverseJoinAttribute>();
                var selectedForAbstract = Attribute.IsDefined(prop, typeof(AbstractAttribute));
                if (joinProp == null && invertAttr == null) // اگر صفت عادی باشد
                {
                    if (result.Cols == null)
                    {
                        result.Cols = new List <ReflectionTableCol>();
                    }
                    result.Cols.Add(new ReflectionTableCol()
                    {
                        Name                = prop.Name,
                        IsSearchable        = Attribute.IsDefined(prop, typeof(SearchableAttribute)),
                        SelectedForAbstract = selectedForAbstract,
                        DisplayName         = prop.GetCustomAttribute <DisplayAttribute>()?.Name
                    });
                }
                else // اگر جوین یا معکوس جوین باشد
                {
                    if (result.JoinTables == null)
                    {
                        result.JoinTables = new List <ReflectionJoinTable>();
                    }

                    if (invertAttr != null)
                    {
                        // چک میکنیم که آیا یک لیست است
                        var isOntoMany = typeof(IEnumerable).IsAssignableFrom(prop.PropertyType);
                        // اگر لیست بود نوع داخل لیست را می فرستیم
                        var propType = isOntoMany
                            ? prop.PropertyType.GetGenericArguments()[0]
                            : prop.PropertyType;
                        var childResult = GetReflectionTable(propType);
                        var joinTable   = new ReflectionJoinTable
                        {
                            ForeignKey          = invertAttr.ForeignKey,
                            ReflectionTable     = childResult,
                            IsInverse           = true,
                            IsOneToMany         = isOntoMany,
                            Property            = prop,
                            SelectedForAbstract = selectedForAbstract
                        };

                        result.JoinTables.Add(joinTable);
                    }
                    else // برای جوین ها
                    {
                        var childResult = GetReflectionTable(prop.PropertyType);
                        var joinTable   = new ReflectionJoinTable()
                        {
                            ForeignKey          = joinProp.ForeignKey,
                            ReflectionTable     = childResult,
                            Property            = prop,
                            SelectedForAbstract = selectedForAbstract
                        };
                        result.JoinTables.Add(joinTable);
                    }
                }
            }

            return(result);
        }
示例#3
0
        internal void ReflectionTableViewModelsMapping(SqlConnectionService connectionService, SelectQuery query, Type type, SqlTransaction transaction = null)
        {
            var dataTables = MultipleSelectQuery(connectionService, query.Query, transaction);
            var viewModel  = GetDataTableReflectedList(type, dataTables);

            query.Root.ViewModelDic = new Dictionary <object, object>();
            foreach (var row in viewModel)
            {
                var key = PropertyReflectionHelper.GetPrimaryKeyNameAndValue(row);
                query.Root.ViewModelDic.Add(key.Value, row);
            }

            var stack = new Stack <SelectStackItem>();

            if (query.Root.JoinTables != null)
            {
                foreach (var joinTable in query.Root.JoinTables)
                {
                    stack.Push(new SelectStackItem()
                    {
                        Table = joinTable
                    });
                }
            }

            while (stack.Any())
            {
                var  item      = stack.Pop();
                Type childType = item.Table.Property.PropertyType;
                if (item.Table.IsOneToMany)
                {
                    childType = childType.GetGenericArguments()[0];
                }

                viewModel = GetDataTableReflectedList(childType, dataTables);
                item.Table.ReflectionTable.ViewModelDic = new Dictionary <object, object>();
                var dic = item.Table.ReflectionTable.ViewModelDic;
                foreach (var row in viewModel)
                {
                    if (!item.Table.IsInverse)
                    {
                        var key = PropertyReflectionHelper.GetPrimaryKeyNameAndValue(row);
                        dic.Add(key.Value, row);
                    }
                    else
                    {
                        var id = PropertyReflectionHelper.GetPropValue(row, item.Table.ForeignKey);
                        if (!item.Table.IsOneToMany)
                        {
                            if (!dic.Contains(id))
                            {
                                dic.Add(id, row);
                            }
                        }
                        else
                        {
                            if (!dic.Contains(id))
                            {
                                var list =
                                    (IList)Activator.CreateInstance(
                                        item.Table.Property.PropertyType);
                                list.Add(row);
                                dic.Add(id, list);
                            }
                            else
                            {
                                var list = (IList)dic[id];
                                list.Add(row);
                            }
                        }
                    }
                }

                if (item.Table.ReflectionTable.JoinTables != null)
                {
                    foreach (var joinTable in item.Table.ReflectionTable.JoinTables)
                    {
                        stack.Push(new SelectStackItem()
                        {
                            Table = joinTable
                        });
                    }
                }
            }
        }