Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
                    }
                }
            }
        }
Exemple #3
0
        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);
        }