/// <summary> /// Set the Primary key Value /// </summary> /// <param name="item"></param> /// <param name="value"></param> /// <returns></returns> public static void SetPrimaryKeyValue(this object item, object value = null) { var prop = item.GetPrimaryKey(); prop.SetValue(item, MethodHelper.ConvertValue(value, prop.PropertyType)); }
/// <summary> /// generic Json to object /// </summary> /// <typeparam name="T"></typeparam> /// <param name="json"></param> /// <returns></returns> internal static T FromJson <T>(this string json, IRepository repository) { var o = JSON.ToObject <T>(json); void LoadJsonIgnoreProperties(object item) { if (item is IList) { foreach (var t in (IList)item) { LoadJsonIgnoreProperties(t); } return; } var type = item?.GetType().GetActualType(); if (type == null) { return; } if (!(item?.GetPrimaryKeyValue().ObjectIsNew() ?? true)) { var primaryId = item.GetPrimaryKeyValue(); foreach (var prop in DeepCloner.GetFastDeepClonerProperties(item.GetType()).Where(x => (x.ContainAttribute <JsonIgnore>() || !x.IsInternalType) && !x.ContainAttribute <ExcludeFromAbstract>() && x.CanRead)) { var value = prop.GetValue(item); if (prop.PropertyType == typeof(string) && string.IsNullOrEmpty(value?.ToString())) { value = string.Empty; } if (prop.IsInternalType && value == LightDataTableShared.ValueByType(prop.PropertyType)) // Value is default { var cmd = repository.GetSqlCommand($"SELECT [{prop.GetPropertyName()}] FROM [{type.TableName()}] WHERE [{item.GetPrimaryKey().GetPropertyName()}] = {Querys.GetValueByType(item.GetPrimaryKeyValue(), repository.DataBaseTypes)}"); var data = repository.ExecuteScalar(cmd); if (data == null) { continue; } if (prop.ContainAttribute <DataEncode>()) { data = new DataCipher(prop.GetCustomAttribute <DataEncode>().Key, prop.GetCustomAttribute <DataEncode>().KeySize).Decrypt(data.ToString()); } else if (prop.ContainAttribute <ToBase64String>() && data.ToString().IsBase64String()) { data = MethodHelper.DecodeStringFromBase64(data.ToString()); } else if (prop.ContainAttribute <JsonDocument>()) { data = data?.ToString().FromJson(prop.PropertyType); } prop.SetValue(item, data.ConvertValue(prop.PropertyType)); } else if (value != null) { LoadJsonIgnoreProperties(value); } } } } LoadJsonIgnoreProperties(o); return(o); }
internal static IList DataReaderConverter(Transaction.Transaction repository, IDataReader reader, DbCommandExtended command, Type type) { var tType = type.GetActualType(); var attachable = tType.GetPrimaryKey() != null; var baseListType = typeof(List <>); var listType = baseListType.MakeGenericType(tType); var iList = DeepCloner.CreateInstance(listType) as IList; var props = DeepCloner.GetFastDeepClonerProperties(tType); try { var colNames = new Custom_ValueType <int, string>(); var pp = new Custom_ValueType <int, FastDeepCloner.IFastDeepClonerProperty>(); while (reader.Read()) { object item = null; object clItem = null; item = DeepCloner.CreateInstance(tType); clItem = attachable ? DeepCloner.CreateInstance(tType) : null; var col = 0; while (col < reader.FieldCount) { string columnName; if (colNames.ContainsKey(col)) { columnName = colNames[col]; } else { columnName = reader.GetName(col); colNames.TryAdd(col, columnName); } var value = reader[columnName]; IFastDeepClonerProperty prop; if (!pp.ContainsKey(col)) { prop = DeepCloner.GetProperty(tType, columnName); if (prop == null) { prop = props.FirstOrDefault(x => string.Equals(x.GetPropertyName(), columnName, StringComparison.CurrentCultureIgnoreCase) || x.GetPropertyName().ToLower() == columnName); } pp.TryAdd(col, prop); } else { prop = pp[col]; } if (prop != null && value != DBNull.Value && value != null && prop.CanRead) { if (value as byte[] != null && prop.PropertyType.FullName.Contains("Guid")) { value = new Guid(value as byte[]); } var dataEncode = prop.GetCustomAttribute <DataEncode>(); if (prop.ContainAttribute <ToBase64String>()) { if (value.ConvertValue <string>().IsBase64String()) { value = MethodHelper.DecodeStringFromBase64(value.ConvertValue <string>()); } else { value = MethodHelper.ConvertValue(value, prop.PropertyType); } } else if (dataEncode != null) { value = new DataCipher(dataEncode.Key, dataEncode.KeySize).Decrypt(value.ConvertValue <string>()); } else if (prop.ContainAttribute <JsonDocument>()) { value = value?.ToString().FromJson(prop.PropertyType); } else if (prop.ContainAttribute <XmlDocument>()) { value = value?.ToString().FromXml(); } else { value = MethodHelper.ConvertValue(value, prop.PropertyType); } prop.SetValue(item, value); if (attachable) { prop.SetValue(clItem, value); } } col++; } if (clItem != null && !(repository?.IsAttached(clItem) ?? true)) { repository?.AttachNew(clItem); } iList.Add(item); } } catch (Exception e) { throw e; } finally { reader.Close(); reader.Dispose(); if (repository.OpenedDataReaders.ContainsKey(reader)) { repository.OpenedDataReaders.Remove(reader); } } return(iList); }
internal static IList DataReaderConverter(Transaction.Transaction repository, IDataReader reader, DbCommandExtended command, Type type) { var tType = type.GetActualType(); var baseListType = typeof(List <>); var listType = baseListType.MakeGenericType(tType); var iList = DeepCloner.CreateInstance(listType) as IList; //#if (NETSTANDARD2_0 || NETSTANDARD1_3 || NETSTANDARD1_5) var props = DeepCloner.GetFastDeepClonerProperties(tType); //#endif try { while (reader.Read()) { object item = null; object clItem = null; //#if (NETSTANDARD2_0 || NETSTANDARD1_3 || NETSTANDARD1_5) item = DeepCloner.CreateInstance(tType); clItem = DeepCloner.CreateInstance(tType); var col = 0; while (col < reader.FieldCount) { var columnName = reader.GetName(col); var value = reader[columnName]; var prop = DeepCloner.GetProperty(tType, columnName); if (prop == null) { prop = props.FirstOrDefault(x => string.Equals(x.GetPropertyName(), columnName, StringComparison.CurrentCultureIgnoreCase) || x.GetPropertyName().ToLower() == columnName); } if (value != DBNull.Value && value != null && prop != null && prop.CanRead) { if (value as byte[] != null && prop.PropertyType.FullName.Contains("Guid")) { value = new Guid(value as byte[]); } var dataEncode = prop.GetCustomAttribute <DataEncode>(); var toBase64String = prop.GetCustomAttribute <ToBase64String>(); if (toBase64String != null) { if (value.ConvertValue <string>().IsBase64String()) { value = MethodHelper.DecodeStringFromBase64(value.ConvertValue <string>()); } else { value = MethodHelper.ConvertValue(value, prop.PropertyType); } } else if (dataEncode != null) { value = new DataCipher(dataEncode.Key, dataEncode.KeySize).Decrypt(value.ConvertValue <string>()); } else if (prop.ContainAttribute <JsonDocument>()) { value = value?.ToString().FromJson(prop.PropertyType); } else { value = MethodHelper.ConvertValue(value, prop.PropertyType); } prop.SetValue(item, value); prop.SetValue(clItem, value); } col++; } //#else // var cmReader = new DataRecordExtended(reader); // if (!CachedDataRecord.ContainsKey(tType)) // CachedDataRecord.GetOrAdd(tType, DynamicBuilder.CreateBuilder(cmReader, tType)); // var x = CachedDataRecord[tType]; // item = x.Build(cmReader); // clItem = !(repository?.IsAttached(item) ?? true) ? x.Build(cmReader) : null; //#endif if (clItem != null && !(repository?.IsAttached(clItem) ?? true)) { repository?.AttachNew(clItem); } iList.Add(item); } } catch (Exception e) { throw e; } finally { reader.Close(); reader.Dispose(); if (repository.OpenedDataReaders.ContainsKey(reader)) { repository.OpenedDataReaders.Remove(reader); } } return(iList); }
/// <summary> /// Set the Primary key Value /// </summary> /// <param name="item"></param> /// <param name="value"></param> /// <returns></returns> public static void SetPrimaryKeyValue(this object item, object value = null) { var prop = DeepCloner.GetFastDeepClonerProperties(item.GetType()).FirstOrDefault(x => x.ContainAttribute <PrimaryKey>()); prop.SetValue(item, MethodHelper.ConvertValue(value, prop.PropertyType)); }