private Expression GetIdentityCheck(DbTableExpression root, MappingEntity entity, Expression instance, MappingTable table) { if (this.mapping.IsExtensionTable(table)) { var keyColNames = this.mapping.GetExtensionKeyColumnNames(table).ToArray(); var relatedMembers = this.mapping.GetExtensionRelatedMembers(table).ToArray(); var where = null as Expression; for (int i = 0, n = keyColNames.Length; i < n; i++) { var relatedMember = relatedMembers[i]; var cex = new DbColumnExpression(TypeHelper.GetMemberType(relatedMember), this.GetColumnType(entity, relatedMember), root.Alias, keyColNames[n]); var nex = this.GetMemberExpression(instance, entity, relatedMember); var eq = cex.Equal(nex); where = (where != null) ? where.And(eq) : where; } return(where); } return(base.GetIdentityCheck(root, entity, instance)); }
internal override DbProjectionExpression GetQueryExpression(MappingEntity entity) { var tables = this.mapping.GetTables(entity); if (tables.Count <= 1) { return(base.GetQueryExpression(entity)); } var aliases = new Dictionary <string, TableAlias>(); var rootTable = tables.Single(ta => !this.mapping.IsExtensionTable(ta)); var tex = new DbTableExpression(new TableAlias(), entity, this.mapping.GetTableName(rootTable)); aliases.Add(this.mapping.GetAlias(rootTable), tex.Alias); var source = tex as Expression; foreach (var table in tables.Where(t => this.mapping.IsExtensionTable(t))) { var joinedTableAlias = new TableAlias(); var extensionAlias = this.mapping.GetAlias(table); aliases.Add(extensionAlias, joinedTableAlias); var keyColumns = this.mapping.GetExtensionKeyColumnNames(table).ToList(); var relatedMembers = this.mapping.GetExtensionRelatedMembers(table).ToList(); var relatedAlias = this.mapping.GetExtensionRelatedAlias(table); aliases.TryGetValue(relatedAlias, out TableAlias relatedTableAlias); var joinedTex = new DbTableExpression(joinedTableAlias, entity, this.mapping.GetTableName(table)); var cond = null as Expression; for (int i = 0, n = keyColumns.Count; i < n; i++) { var memberType = TypeHelper.GetMemberType(relatedMembers[i]); var colType = this.GetColumnType(entity, relatedMembers[i]); var relatedColumn = new DbColumnExpression(memberType, colType, relatedTableAlias, this.mapping.GetColumnName(entity, relatedMembers[i])); var joinedColumn = new DbColumnExpression(memberType, colType, joinedTableAlias, keyColumns[i]); var eq = joinedColumn.Equal(relatedColumn); cond = (cond != null) ? cond.And(eq) : eq; } source = new DbJoinExpression(JoinType.SingletonLeftOuter, source, joinedTex, cond); } var columns = new List <DbColumnDeclaration>(); this.GetColumns(entity, aliases, columns); var root = new DbSelectExpression(new TableAlias(), columns, source, null); var existingAliases = aliases.Values.ToArray(); var projector = this.GetEntityExpression(root, entity) as Expression; var selectAlias = new TableAlias(); var pc = DbColumnProjector.ProjectColumns(this.Translator.Linguist.Language, projector, null, selectAlias, root.Alias); var proj = new DbProjectionExpression ( new DbSelectExpression(selectAlias, pc.Columns, root, null), pc.Projector ); return(this.Translator.Police.ApplyPolicy(proj, entity.ElementType.GetTypeInfo()) as DbProjectionExpression); }