public SqlExpression BuildProjection(SqlExpression item, MetaType rowType, bool allowDeferred, SqlLink link, Expression source) { if (!rowType.HasInheritance) { return(BuildProjectionInternal(item, rowType, (rowType.Table != null) ? rowType.PersistentDataMembers : rowType.DataMembers, allowDeferred, link, source)); } var list = new List <MetaType>(rowType.InheritanceTypes); var list2 = new List <SqlTypeCaseWhen>(); SqlTypeCaseWhen when = null; MetaType inheritanceRoot = rowType.InheritanceRoot; MetaDataMember discriminator = inheritanceRoot.Discriminator; Type type = discriminator.Type; SqlMember member2 = sql.Member(item, discriminator.Member); foreach (MetaType type3 in list) { if (type3.HasInheritanceCode) { SqlNew typeBinding = BuildProjectionInternal(item, type3, type3.PersistentDataMembers, allowDeferred, link, source); if (type3.IsInheritanceDefault) { when = new SqlTypeCaseWhen(null, typeBinding); } object obj2 = InheritanceRules.InheritanceCodeForClientCompare(type3.InheritanceCode, member2.SqlType); SqlExpression match = sql.Value(type, sql.Default(discriminator), obj2, true, source); list2.Add(new SqlTypeCaseWhen(match, typeBinding)); } } if (when == null) { throw Error.EmptyCaseNotSupported(); } list2.Add(when); return(sql.TypeCase(inheritanceRoot.Type, inheritanceRoot, member2, list2.ToArray(), source)); }
private int BuildFieldDeclarations(MetaType type, IDictionary <object, string> memberNameToMappedName, StringBuilder sb) { int num = 0; foreach (MetaDataMember member in type.DataMembers) { string str; if ((!member.IsDeclaredBy(type) || member.IsAssociation) || !member.IsPersistent) { continue; } object key = InheritanceRules.DistinguishedMemberName(member.Member); if (memberNameToMappedName.TryGetValue(key, out str)) { if (str != member.MappedName) { goto Label_0075; } continue; } memberNameToMappedName.Add(key, member.MappedName); Label_0075: if (sb.Length > 0) { sb.Append(", "); } sb.AppendLine(); sb.Append(string.Format(CultureInfo.InvariantCulture, " {0} ", new object[] { SqlIdentifier.QuoteCompoundIdentifier(member.MappedName) })); if (!string.IsNullOrEmpty(member.Expression)) { sb.Append("AS " + member.Expression); } else { sb.Append(GetDbType(member)); } num++; } return(num); }