コード例 #1
0
        private string TranslateOneToMany(string functionName, MemberExpression memberExpression, LambdaExpression fieldExpression, LambdaExpression filterExpression)
        {
            if (!string.IsNullOrEmpty(TranslateMember(memberExpression))) // this shouldn't return any SQL
            {
                throw new SqlExpressionTranslatorException(memberExpression.ToString());
            }

            var relation = GetRelation(memberExpression.Expression, memberExpression.Member.Name);

            if (relation == null)
            {
                throw new SqlExpressionTranslatorException(memberExpression.ToString());
            }

            if (fieldExpression != null && filterExpression != null && fieldExpression.Parameters[0] != filterExpression.Parameters[0])
            {
                throw new SqlExpressionTranslatorException(null);
            }

            var iterator = fieldExpression != null ? fieldExpression.Parameters[0] : filterExpression != null ? filterExpression.Parameters[0] : Expression.Parameter(relation.ElementType);

            LambdaExpression relationExpression = CreateToManyFilterExpression(relation, memberExpression.Expression, filterExpression, iterator);

            var template = _toManyTemplates[functionName];

            if (template == null)
            {
                throw new NotSupportedException(functionName);
            }

            var alias = SqlNameGenerator.NextTableAlias();

            _metaData[iterator] = new ExpressionMetaData {
                Iterator = iterator, Relation = relation, Schema = relation.ForeignSchema
            };

            _relationAliases[iterator] = new Dictionary <object, string> {
                { relation, alias }
            };

            _subQueries.Push(new SubQuery());

            string sqlFields = Translate(fieldExpression);
            string sqlWhere  = Translate(relationExpression);
            string sqlJoins  = (Joins.Count > 0) ? string.Join(" ", Joins.Select(join => join.ToSql(_sqlDialect))) : null;

            _subQueries.Pop();

            return(string.Format(template,
                                 sqlFields,
                                 _sqlDialect.QuoteTable(relation.ForeignSchema.MappedName) + " " + alias, sqlJoins ?? "",
                                 sqlWhere
                                 ));
        }
コード例 #2
0
        public override void Purge(TableSchema schema)
        {
            var tableName = SqlDialect.QuoteTable(schema.MappedName);

            ExecuteSql("DELETE FROM " + tableName, null);

            if (SqlQueryScalar("select name from sqlite_master where name='sqlite_sequence'", null).Any())
            {
                ExecuteSql("delete from sqlite_sequence where name=@name", QueryParameterCollection.FromObject(new { name = schema.MappedName }));
            }
        }