internal void AddJoinFilter(JoinItem join, SQLParamCreater creater) { var filter = Filter(join, creater); if (filter != null) { join.ON(filter); } }
private void FillSelectScript(string name, int level, SQLScriptCollection collection, WhereItem where = null, Stack <JoinItem <TableEntity> > stack = null) { if (collection == null) { throw new ArgumentNullException("collection"); } var script = collection.NewSQLScript(level == 0 ? 0.ToString() : string.Format("{0}-{1}", name.Trim(), level), SQLTYPE.SELECT); var alias = collection.NewTableAlias(); var from = new FromItem <TableEntity>(collection.accessor, Entity, alias); var select = new SelectItem(collection.accessor, from); script.AddItems(select, from); //Build Jions JoinItem <TableEntity>[] join_items = null; if (stack != null) { if (HasForeigns) { join_items = new JoinItem <TableEntity> [stack.Count]; stack.CopyTo(join_items, 0); } TableItem table1 = from; JoinItem <TableEntity> table2 = null; while (stack.Count > 0) { table2 = stack.Pop().Clone() as JoinItem <TableEntity>; table2.ON(table1, table2.Keys.ToArray()); table2.Entity.AddJoinFilter(table2, collection.SQLParamCreater); script.AddItems(table2); table1 = table2; } } //Build Where if (level == 0) { var where1 = new WhereItem(collection.accessor, from); Columns.Where(c => c.IsPK).ToList().ForEach(col => { var param = collection.NewParameter(col.Value); where1.And(where1.ColumnEquals(col.Name, param)); }); where = where == null ? where1 : where + where1; } if (where != null) { script.AddItem(where.Clone() as WhereItem); } var where0 = new WhereItem(collection.accessor, from); Entity.AddWhereFilter(where0, collection.SQLParamCreater); script.AddItem(where0); foreach (var foreign in this.Foreigns) { var nstack = join_items != null ? new Stack <JoinItem <TableEntity> >(join_items) : new Stack <JoinItem <TableEntity> >(); nstack.Push(new JoinItem <TableEntity>(collection.accessor, Entity, alias, foreign.Keys.Select(key => key.ToKeyValuePair()).ToArray())); foreign.EntityInst.Schema.FillSelectScript(foreign.Name, level + 1, collection, where.Clone() as WhereItem, nstack); } }