// 创建 DELETE 命令 protected override DbCommandDefinition ParseDeleteCommand <T>(DbQueryableInfo_Delete <T> dQuery, List <IDbDataParameter> parameters = null) { TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); ISqlBuilder builder = this.CreateSqlBuilder(parameters); bool useKey = false; builder.Append("DELETE FROM "); builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary); builder.Append(" t0 "); if (dQuery.Entity != null) { object entity = dQuery.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var kv in typeRuntime.Invokers) { MemberInvokerBase invoker = kv.Value; var column = invoker.Column; if (column != null && column.IsKey) { useKey = true; var value = invoker.Invoke(entity); var seg = builder.GetSqlValue(value, column); builder.AppendMember("t0", invoker.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } ; } builder.Length -= 5; if (!useKey) { throw new XFrameworkException("Delete<T>(T value) require T must have key column."); } } else if (dQuery.SelectInfo != null) { TableAliasCache aliases = this.PrepareAlias <T>(dQuery.SelectInfo); var cmd2 = new OracleDbCommandDefinition_Delete(this, aliases, builder.Parameters); cmd2.HaveListNavigation = dQuery.SelectInfo.HaveListNavigation; var visitor0 = new OracleJoinExpressionVisitor(this, aliases, dQuery.SelectInfo.Join, dQuery.SelectInfo.Where); visitor0.Write(cmd2); var visitor1 = new OracleWhereExpressionVisitor(this, aliases, dQuery.SelectInfo.Where); visitor1.Write(cmd2.WhereFragment); cmd2.AddNavMembers(visitor1.NavMembers); builder.Append(cmd2.CommandText); } builder.Append(';'); return(new DbCommandDefinition(builder.ToString(), builder.Parameters, System.Data.CommandType.Text)); }
// 创建 DELETE 命令 protected override CommandDefine ParseDeleteCommand <T>(DbQueryableInfo_Delete <T> qDelete) { var rInfo = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); SqlBuilder builder = new SqlBuilder(this.EscCharLeft, this.EscCharRight); bool useKey = false; builder.Append("DELETE t0 FROM "); builder.AppendMember(rInfo.TableName); builder.Append(" t0 "); if (qDelete.Entity != null) { object entity = qDelete.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var kv in rInfo.Wrappers) { var wrapper = kv.Value as MemberAccessWrapper; var column = wrapper.Column; if (column != null && column.IsKey) { useKey = true; var value = wrapper.Get(entity); var seg = ExpressionVisitorBase.GetSqlValue(value); builder.AppendMember("t0", wrapper.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } ; } builder.Length -= 5; if (!useKey) { throw new XfwException("Delete<T>(T value) require T must have key column."); } } else if (qDelete.SelectInfo != null) { TableAliasCache aliases = this.PrepareAlias <T>(qDelete.SelectInfo); var sc = new CommandDefine_Select.Builder(this.EscCharLeft, this.EscCharRight, aliases); ExpressionVisitorBase visitor = new JoinExpressionVisitor(this, aliases, qDelete.SelectInfo.Join); visitor.Write(sc.JoinFragment); visitor = new WhereExpressionVisitor(this, aliases, qDelete.SelectInfo.Where); visitor.Write(sc.WhereFragment); sc.AddNavigation(visitor.Navigations); builder.Append(sc.Command); } return(new CommandDefine(builder.ToString(), null, System.Data.CommandType.Text)); //builder.ToString(); }
// 创建 DELETE 命令 protected override Command ResolveDeleteCommand <T>(DbQueryableInfo_Delete <T> dbQuery, ResolveToken token) { ISqlBuilder builder = this.CreateSqlBuilder(token); TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); IDbQueryable sourceQuery = dbQuery.SourceQuery; var context = (SqlServerDbContext)sourceQuery.DbContext; builder.Append("DELETE t0 FROM "); builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary); builder.Append(" t0 "); if (dbQuery.Entity != null) { if (typeRuntime.KeyInvokers == null || typeRuntime.KeyInvokers.Count == 0) { throw new XFrameworkException("Delete<T>(T value) require entity must have key column."); } object entity = dbQuery.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var invoker in typeRuntime.KeyInvokers) { var column = invoker.Column; var value = invoker.Invoke(entity); var seg = this.DbValue.GetSqlValue(value, token, column); builder.AppendMember("t0", invoker.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } builder.Length -= 5; } else if (dbQuery.SelectInfo != null) { TableAliasCache aliases = this.PrepareTableAlias <T>(dbQuery.SelectInfo, token); var cmd2 = new SqlServerMapperCommand(context, aliases, token) { HasMany = dbQuery.SelectInfo.HasMany }; ExpressionVisitorBase visitor = new SqlServerJoinExpressionVisitor(context, aliases, dbQuery.SelectInfo.Joins); visitor.Write(cmd2.JoinFragment); visitor = new WhereExpressionVisitor(this, aliases, dbQuery.SelectInfo.Condtion); visitor.Write(cmd2.WhereFragment); cmd2.AddNavMembers(visitor.NavMembers); builder.Append(cmd2.CommandText); } return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text)); }
// 创建 DELETE 命令 protected override Command ParseDeleteCommand <T>(DbQueryableInfo_Delete <T> dQueryInfo, ResolveToken token) { TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); ISqlBuilder builder = this.CreateSqlBuilder(token); builder.Append("DELETE FROM "); builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary); builder.Append(" t0 "); if (dQueryInfo.Entity != null) { if (typeRuntime.KeyInvokers == null || typeRuntime.KeyInvokers.Count == 0) { throw new XFrameworkException("Delete<T>(T value) require entity must have key column."); } object entity = dQueryInfo.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var invoker in typeRuntime.KeyInvokers) { var column = invoker.Column; var value = invoker.Invoke(entity); var seg = this.DbValue.GetSqlValue(value, token, column); builder.AppendMember("t0", invoker.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } builder.Length -= 5; } else if (dQueryInfo.SelectInfo != null) { TableAliasCache aliases = this.PrepareAlias <T>(dQueryInfo.SelectInfo, token); var cmd2 = new NpgNavigationCommand(this, aliases, DbExpressionType.Delete, token) { HasMany = dQueryInfo.SelectInfo.HasMany }; var visitor0 = new NpgJoinExpressionVisitor(this, aliases, dQueryInfo.SelectInfo.Joins, DbExpressionType.Delete); visitor0.Write(cmd2); var visitor1 = new NpgWhereExpressionVisitor(this, aliases, dQueryInfo.SelectInfo.WhereExpression); visitor1.Write(cmd2.WhereFragment); cmd2.AddNavMembers(visitor1.NavMembers); builder.Append(cmd2.CommandText); } builder.Append(';'); return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text)); }
// 创建 DELETE 命令 protected override Command ParseDeleteCommand <T>(DbQueryableInfo_Delete <T> dQueryInfo, ParserToken token) { TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); ISqlBuilder builder = this.CreateSqlBuilder(token); bool useKey = false; builder.Append("DELETE t0 FROM "); builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary); builder.Append(" t0 "); if (dQueryInfo.Entity != null) { object entity = dQueryInfo.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var kv in typeRuntime.Invokers) { MemberInvokerBase invoker = kv.Value; var column = invoker.Column; if (column != null && column.IsKey) { useKey = true; var value = invoker.Invoke(entity); var seg = builder.GetSqlValue(value, column); builder.AppendMember("t0", invoker.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } ; } builder.Length -= 5; if (!useKey) { throw new XFrameworkException("Delete<T>(T value) require T must have key column."); } } else if (dQueryInfo.SelectInfo != null) { IDbQueryable dbQueryable = dQueryInfo.SourceQuery; TableAliasCache aliases = this.PrepareAlias <T>(dQueryInfo.SelectInfo, token); var cmd2 = new SelectCommand(this, aliases, token) { HasManyNavigation = dQueryInfo.SelectInfo.HasManyNavigation }; ExpressionVisitorBase visitor = new JoinExpressionVisitor(this, aliases, dQueryInfo.SelectInfo.Joins); visitor.Write(cmd2.JoinFragment); visitor = new WhereExpressionVisitor(this, aliases, dQueryInfo.SelectInfo.WhereExpression); visitor.Write(cmd2.WhereFragment); cmd2.AddNavMembers(visitor.NavMembers); builder.Append(cmd2.CommandText); } return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text)); }
// 创建 DELETE 命令 protected override Command ParseDeleteCommand <T>(DbQueryableInfo_Delete <T> dQueryInfo, ResolveToken token) { ISqlBuilder builder = this.CreateSqlBuilder(token); TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); builder.Append("DELETE FROM "); builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary); builder.Append(" "); if (dQueryInfo.Entity != null) { if (typeRuntime.KeyInvokers == null || typeRuntime.KeyInvokers.Count == 0) { throw new XFrameworkException("Delete<T>(T value) require entity must have key column."); } object entity = dQueryInfo.Entity; builder.AppendNewLine(); builder.Append("WHERE "); foreach (var invoker in typeRuntime.KeyInvokers) { var column = invoker.Column; var value = invoker.Invoke(entity); var seg = this.DbValue.GetSqlValue(value, token, column); builder.AppendMember(invoker.Member.Name); builder.Append(" = "); builder.Append(seg); builder.Append(" AND "); } builder.Length -= 5; } else if (dQueryInfo.SelectInfo != null) { LambdaExpression lambda = null; var dbQuery = dQueryInfo.SourceQuery; if (dbQuery.DbExpressions != null && dbQuery.DbExpressions.Count > 1) { switch (dbQuery.DbExpressions[1].DbExpressionType) { case DbExpressionType.Join: case DbExpressionType.GroupJoin: case DbExpressionType.GroupRightJoin: lambda = (LambdaExpression)dbQuery.DbExpressions[1].Expressions[1]; break; case DbExpressionType.Select: case DbExpressionType.SelectMany: lambda = (LambdaExpression)dbQuery.DbExpressions[1].Expressions[0]; break; } } if (lambda == null) { DbExpression dbExpression = dQueryInfo.SelectInfo.SelectExpression; dbExpression = dQueryInfo.SelectInfo.WhereExpression; if (dbExpression != null && dbExpression.Expressions != null) { lambda = (LambdaExpression)dbExpression.Expressions[0]; } } // 解析查询以确定是否需要嵌套 var parameter = Expression.Parameter(typeof(SQLiteRowId), lambda != null ? lambda.Parameters[0].Name : "x"); var expression = Expression.MakeMemberAccess(parameter, (_rowIdExpression.Body as MemberExpression).Member); dQueryInfo.SelectInfo.SelectExpression = new DbExpression(DbExpressionType.Select, expression); var cmd = (MappingCommand)this.ParseSelectCommand <T>(dQueryInfo.SelectInfo, 1, false, null); if (token != null && token.Extendsions == null) { token.Extendsions = new Dictionary <string, object>(); if (!token.Extendsions.ContainsKey("SQLiteDelete")) { token.Extendsions.Add("SQLiteDelete", null); } } if ((cmd.NavMembers != null && cmd.NavMembers.Count > 0) || dQueryInfo.SelectInfo.Joins.Count > 0) { cmd = (MappingCommand)this.ParseSelectCommand <T>(dQueryInfo.SelectInfo, 1, false, token); builder.Append("WHERE "); builder.AppendMember("RowID"); builder.Append(" IN("); builder.AppendNewLine(cmd.CommandText); builder.Append(')'); } else { TableAliasCache aliases = this.PrepareAlias <T>(dQueryInfo.SelectInfo, token); ExpressionVisitorBase visitor = null; visitor = new JoinExpressionVisitor(this, aliases, dQueryInfo.SelectInfo.Joins); visitor.Write(builder); visitor = new WhereExpressionVisitor(this, null, dQueryInfo.SelectInfo.WhereExpression); visitor.Write(builder); } } builder.Append(';'); return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text)); }