private IColumn GetColumn(MemberInfo[] members) { IFieldFinder?current = (Table)this.Table; Field? field = null; for (int i = 0; i < members.Length - 1; i++) { if (current == null) { throw new InvalidOperationException("{0} does not implement {1}".FormatWith(field, typeof(IFieldFinder).Name)); } field = current.GetField(members[i]); current = field as IFieldFinder; } var lastMember = members[members.Length - 1]; if (lastMember is Type t) { return(((FieldImplementedBy)field !).ImplementationColumns.GetOrThrow(t)); } else if (current != null) { return((IColumn)current.GetField(lastMember)); } else { throw new InvalidOperationException("Unexpected"); } }
internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id) { var implementations = ImplementationColumns.SelectDictionary(t => t, (t, ic) => new EntityExpression(t, new PrimaryKeyExpression(new ColumnExpression(ic.Type.Nullify(), tableAlias, ic.Name)), null, null, null, AvoidExpandOnRetrieving)); var result = new ImplementedByExpression(IsLite ? Lite.Extract(FieldType) : FieldType, SplitStrategy, implementations); if (this.IsLite) { return(binder.MakeLite(result, null)); } else { return(result); } }