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); } } } } } } }
/// <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); }
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 }); } } } }