static IColumn[] GetColumns(IFieldFinder finder, LambdaExpression field) { var body = field.Body; Type?type = RemoveCasting(ref body); body = IndexWhereExpressionVisitor.RemoveLiteEntity(body); var members = Reflector.GetMemberListBase(body); if (members.Any(a => ignoreMembers.Contains(a.Name))) { members = members.Where(a => !ignoreMembers.Contains(a.Name)).ToArray(); } Field f = Schema.FindField(finder, members); if (type != null) { var ib = f as FieldImplementedBy; if (ib == null) { throw new InvalidOperationException("Casting only supported for {0}".FormatWith(typeof(FieldImplementedBy).Name)); } return((from ic in ib.ImplementationColumns where type.IsAssignableFrom(ic.Key) select(IColumn) ic.Value).ToArray()); } return(TableIndex.GetColumnsFromFields(f)); }
public TableIndex AddIndex(ITable table, Field[] fields) { var index = new TableIndex(table, TableIndex.GetColumnsFromFields(fields)); AddIndex(index); return(index); }
public List <TableIndex> GeneratAllIndexes() { IEnumerable <EntityField> fields = Fields.Values.AsEnumerable(); if (Mixins != null) { fields = fields.Concat(Mixins.Values.SelectMany(m => m.Fields.Values)); } var result = fields.SelectMany(f => f.Field.GenerateIndexes(this)).ToList(); if (MultiColumnIndexes != null) { result.AddRange(MultiColumnIndexes); } if (result.OfType <UniqueTableIndex>().Any()) { var s = Schema.Current.Settings; List <IColumn> attachedFields = fields.Where(f => s.FieldAttributes(PropertyRoute.Root(this.Type).Add(f.FieldInfo)).OfType <AttachToUniqueIndexesAttribute>().Any()) .SelectMany(f => TableIndex.GetColumnsFromFields(f.Field)) .ToList(); if (attachedFields.Any()) { result = result.Select(ix => { var ui = ix as UniqueTableIndex; if (ui == null || ui.AvoidAttachToUniqueIndexes) { return(ix); } return(new UniqueTableIndex(ui.Table, ui.Columns.Concat(attachedFields).ToArray()) { Where = ui.Where }); }).ToList(); } } if (this.SystemVersioned != null) { result.Add(new TableIndex(this, this.SystemVersioned.Columns().PreAnd(this.PrimaryKey).ToArray())); } return(result); }
public virtual UniqueTableIndex?GenerateUniqueIndex(ITable table, UniqueIndexAttribute?attribute) { if (attribute == null) { return(null); } var result = new UniqueTableIndex(table, TableIndex.GetColumnsFromFields(this)) { AvoidAttachToUniqueIndexes = attribute.AvoidAttachToUniqueIndexes }; if (attribute.AllowMultipleNulls) { result.Where = IndexWhereExpressionVisitor.IsNull(this, false); } return(result); }