public virtual string GetTableFilter(TableFilterExpression tableFilter) { var filter = tableFilter.Filter; var prefix = string.Empty; var alias = tableFilter.Table.Alias; if (!string.IsNullOrWhiteSpace(alias)) prefix = GetTableAlias(alias) + "."; GetTableAlias(tableFilter.Table.Alias); foreach (var col in tableFilter.Table.TableInfo.Columns) { var name = "{" + col.Member.MemberName + "}"; if (!filter.Contains(name)) continue; var colRef = prefix + '"' + col.ColumnName + '"'; filter = filter.Replace(name, colRef); } filter = "(" + filter + ")"; return filter; }
private Expression AnalyzeEntityListMember(TableExpression table, PropertyInfo property, TranslationContext context) { var propType = property.PropertyType; if (!propType.IsEntitySequence()) return null; var modelInfo = context.DbModel.EntityApp.Model; var masterEntInfo = modelInfo.GetEntityInfo(table.Type); var entMember = masterEntInfo.GetMember(property.Name); Util.Check(entMember != null, "Failed to find member {0} on entity {1}.", property.Name, masterEntInfo.Name); Util.Check(entMember.Kind == MemberKind.EntityList, "Internal LINQ error: expected List member ({0}.{1}", masterEntInfo.Name, property.Name); var listInfo = entMember.ChildListInfo; Expression whereExpr; switch(listInfo.RelationType) { case EntityRelationType.ManyToOne: var childTable = CreateTable(listInfo.TargetEntity.EntityType, context); whereExpr = BuildListPropertyJoinExpression(childTable, table, listInfo.ParentRefMember, context); if (!string.IsNullOrWhiteSpace(listInfo.Filter)) { var filterExpr = new TableFilterExpression(childTable, listInfo.Filter); whereExpr = Expression.And(whereExpr, filterExpr); } context.CurrentSelect.Where.Add(whereExpr); return childTable; case EntityRelationType.ManyToMany: var linkTable = CreateTable(listInfo.LinkEntity.EntityType, context); whereExpr = BuildListPropertyJoinExpression(linkTable, table, listInfo.ParentRefMember, context); context.CurrentSelect.Where.Add(whereExpr); var targetTable = RegisterAssociation(linkTable, listInfo.OtherEntityRefMember, context); return targetTable; } return null; //never happens }