protected void SetListChildResults(FieldDefinition fieldDef, Type refType, IList childResults, FieldDefinition refField) { var map = new Dictionary <object, List <object> >(); List <object> refValues; foreach (var result in childResults) { var refValue = refField.GetValue(result); if (!map.TryGetValue(refValue, out refValues)) { map[refValue] = refValues = new List <object>(); } refValues.Add(result); } var untypedApi = dbCmd.CreateTypedApi(refType); foreach (var result in parentResults) { var pkValue = modelDef.PrimaryKey.GetValue(result); if (map.TryGetValue(pkValue, out refValues)) { var castResults = untypedApi.Cast(refValues); fieldDef.SetValueFn(result, castResults); } } }
public static void SaveAllReferences <T>(this IDbCommand dbCmd, T instance) { var modelDef = ModelDefinition <T> .Definition; var pkValue = modelDef.PrimaryKey.GetValue(instance); var fieldDefs = modelDef.AllFieldDefinitionsArray.Where(x => x.IsReference); foreach (var fieldDef in fieldDefs) { var listInterface = fieldDef.FieldType.GetTypeWithGenericInterfaceOf(typeof(IList <>)); if (listInterface != null) { var refType = listInterface.GenericTypeArguments()[0]; var refModelDef = refType.GetModelDefinition(); var refField = GetRefFieldDef(modelDef, refModelDef, refType); var results = (IEnumerable)fieldDef.GetValue(instance); if (results != null) { foreach (var oRef in results) { refField.SetValueFn(oRef, pkValue); } dbCmd.CreateTypedApi(refType).SaveAll(results); } } else { var refType = fieldDef.FieldType; var refModelDef = refType.GetModelDefinition(); var refField = GetRefFieldDef(modelDef, refModelDef, fieldDef.FieldType); var result = fieldDef.GetValue(instance); if (result != null) { refField.SetValueFn(result, pkValue); dbCmd.CreateTypedApi(refType).Save(result); } } } }
internal static void SaveAllReferences <T>(this IDbCommand dbCmd, T instance) { var modelDef = ModelDefinition <T> .Definition; var pkValue = modelDef.PrimaryKey.GetValue(instance); var fieldDefs = modelDef.AllFieldDefinitionsArray.Where(x => x.IsReference); bool updateInstance = false; foreach (var fieldDef in fieldDefs) { var listInterface = fieldDef.FieldType.GetTypeWithGenericInterfaceOf(typeof(IList <>)); if (listInterface != null) { var refType = listInterface.GetGenericArguments()[0]; var refModelDef = refType.GetModelDefinition(); var refField = modelDef.GetRefFieldDef(refModelDef, refType); var results = (IEnumerable)fieldDef.GetValue(instance); if (results != null) { foreach (var oRef in results) { refField.SetValue(oRef, pkValue); } dbCmd.CreateTypedApi(refType).SaveAll(results); } } else { var refType = fieldDef.FieldType; var refModelDef = refType.GetModelDefinition(); var refSelf = modelDef.GetSelfRefFieldDefIfExists(refModelDef, fieldDef); var result = fieldDef.GetValue(instance); var refField = refSelf == null ? modelDef.GetRefFieldDef(refModelDef, refType) : modelDef.GetRefFieldDefIfExists(refModelDef); if (result != null) { if (refField != null && refSelf == null) { refField.SetValue(result, pkValue); } dbCmd.CreateTypedApi(refType).Save(result); //Save Self Table.RefTableId PK if (refSelf != null) { var refPkValue = refModelDef.PrimaryKey.GetValue(result); refSelf.SetValue(instance, refPkValue); updateInstance = true; } } } } if (updateInstance) { dbCmd.Update(instance); } }
internal static List <Into> LoadListWithReferences <Into, From>(this IDbCommand dbCmd, SqlExpression <From> expr = null) { var dialectProvider = OrmLiteConfig.DialectProvider; if (expr == null) { expr = dialectProvider.SqlExpression <From>(); } var sql = expr.SelectInto <Into>(); var parentResults = dbCmd.ExprConvertToList <Into>(sql); var modelDef = ModelDefinition <Into> .Definition; var fieldDefs = modelDef.AllFieldDefinitionsArray.Where(x => x.IsReference); expr.Select(dialectProvider.GetQuotedColumnName(modelDef, modelDef.PrimaryKey)); var subSql = expr.ToSelectStatement(); foreach (var fieldDef in fieldDefs) { var listInterface = fieldDef.FieldType.GetTypeWithGenericInterfaceOf(typeof(IList <>)); if (listInterface != null) { var refType = listInterface.GenericTypeArguments()[0]; var refModelDef = refType.GetModelDefinition(); var refField = GetRefFieldDef(modelDef, refModelDef, refType); var sqlRef = "SELECT {0} FROM {1} WHERE {2} IN ({3})".Fmt( dialectProvider.GetColumnNames(refModelDef), dialectProvider.GetQuotedTableName(refModelDef), dialectProvider.GetQuotedColumnName(refField), subSql); var childResults = dbCmd.ConvertToList(refType, sqlRef); var map = new Dictionary <object, List <object> >(); List <object> refValues; foreach (var result in childResults) { var refValue = refField.GetValue(result); if (!map.TryGetValue(refValue, out refValues)) { map[refValue] = refValues = new List <object>(); } refValues.Add(result); } var untypedApi = dbCmd.CreateTypedApi(refType); foreach (var result in parentResults) { var pkValue = modelDef.PrimaryKey.GetValue(result); if (map.TryGetValue(pkValue, out refValues)) { var castResults = untypedApi.Cast(refValues); fieldDef.SetValueFn(result, castResults); } } } else { var refType = fieldDef.FieldType; var refModelDef = refType.GetModelDefinition(); var refSelf = GetSelfRefFieldDefIfExists(modelDef, refModelDef); var refField = refSelf == null ? GetRefFieldDef(modelDef, refModelDef, refType) : GetRefFieldDefIfExists(modelDef, refModelDef); var map = new Dictionary <object, object>(); if (refField != null) { var sqlRef = "SELECT {0} FROM {1} WHERE {2} IN ({3})".Fmt( dialectProvider.GetColumnNames(refModelDef), dialectProvider.GetQuotedTableName(refModelDef), dialectProvider.GetQuotedColumnName(refField), subSql); var childResults = dbCmd.ConvertToList(refType, sqlRef); foreach (var result in childResults) { var refValue = refField.GetValue(result); map[refValue] = result; } foreach (var result in parentResults) { object childResult; var pkValue = modelDef.PrimaryKey.GetValue(result); if (map.TryGetValue(pkValue, out childResult)) { fieldDef.SetValueFn(result, childResult); } } } else if (refSelf != null) { //Load Self Table.RefTableId PK expr.Select(dialectProvider.GetQuotedColumnName(refSelf)); subSql = expr.ToSelectStatement(); var sqlRef = "SELECT {0} FROM {1} WHERE {2} IN ({3})".Fmt( dialectProvider.GetColumnNames(refModelDef), dialectProvider.GetQuotedTableName(refModelDef), dialectProvider.GetQuotedColumnName(refModelDef.PrimaryKey), subSql); var childResults = dbCmd.ConvertToList(refType, sqlRef); foreach (var result in childResults) { var pkValue = refModelDef.PrimaryKey.GetValue(result); map[pkValue] = result; } foreach (var result in parentResults) { object childResult; var fkValue = refSelf.GetValue(result); if (fkValue != null && map.TryGetValue(fkValue, out childResult)) { fieldDef.SetValueFn(result, childResult); } } } } } return(parentResults); }