public TableIndex AddIndexMList <T, V>(Expression <Func <T, MList <V> > > toMList, Expression <Func <MListElement <T, V>, object> > fields, Expression <Func <MListElement <T, V>, bool> >?where = null, Expression <Func <MListElement <T, V>, object> >?includeFields = null) where T : Entity { TableMList table = ((FieldMList)Schema.FindField(Schema.Table(typeof(T)), Reflector.GetMemberList(toMList))).TableMList; IColumn[] columns = IndexKeyColumns.Split(table, fields); var index = AddIndex(table, columns); if (where != null) { index.Where = IndexWhereExpressionVisitor.GetIndexWhere(where, table); } if (includeFields != null) { index.IncludeColumns = IndexKeyColumns.Split(table, includeFields); if (table.SystemVersioned != null) { index.IncludeColumns = index.IncludeColumns.Concat(table.SystemVersioned.Columns()).ToArray(); } } return(index); }
public UniqueIndex AddUniqueIndexMList <T, V>(Expression <Func <T, MList <V> > > toMList, Expression <Func <MListElement <T, V>, object> > fields, Expression <Func <MListElement <T, V>, bool> > where) where T : Entity { TableMList table = ((FieldMList)Schema.FindField(Schema.Table(typeof(T)), Reflector.GetMemberList(toMList))).TableMList; IColumn[] columns = IndexKeyColumns.Split(table, fields); var index = AddUniqueIndex(table, columns); if (where != null) { index.Where = IndexWhereExpressionVisitor.GetIndexWhere(where, table); } return(index); }
public MListElementExpression(Expression rowId, EntityExpression parent, Expression element, TableMList table) : base(DbExpressionType.MListElement, typeof(MListElement<,>).MakeGenericType(parent.Type, element.Type)) { this.RowId = rowId; this.Parent = parent; this.Element = element; this.Table = table; }
public MListExpression(Type type, Expression backID, TableMList tr) :base(DbExpressionType.MList, type) { this.BackID = backID; this.TableMList = tr; }
public FieldMList(PropertyRoute route, TableMList tableMList) : base(route) { this.TableMList = tableMList; }
protected virtual FieldMList GenerateFieldMList(Table table, PropertyRoute route, NameSequence name) { Type elementType = route.Type.ElementType(); if (table.Ticks == null) { throw new InvalidOperationException("Type '{0}' has field '{1}' but does not Ticks. MList requires concurrency control.".FormatWith(route.Parent.Type.TypeName(), route.FieldInfo.FieldName())); } var orderAttr = Settings.FieldAttribute <PreserveOrderAttribute>(route); FieldValue order = null; if (orderAttr != null) { var pair = Settings.GetSqlDbTypePair(typeof(int)); order = new FieldValue(typeof(int)) { Name = orderAttr.Name ?? "Order", SqlDbType = pair.SqlDbType, UserDefinedTypeName = pair.UserDefinedTypeName, Nullable = false, Size = Settings.GetSqlSize(orderAttr, pair.SqlDbType), Scale = Settings.GetSqlScale(orderAttr, pair.SqlDbType), }; } var keyAttr = Settings.FieldAttribute <PrimaryKeyAttribute>(route) ?? Settings.DefaultPrimaryKeyAttribute; TableMList.PrimaryKeyColumn primaryKey; { var pair = Settings.GetSqlDbType(keyAttr, keyAttr.Type); primaryKey = new TableMList.PrimaryKeyColumn { Name = keyAttr.Name, Type = keyAttr.Type, SqlDbType = pair.SqlDbType, UserDefinedTypeName = pair.UserDefinedTypeName, Default = keyAttr.Default, Identity = keyAttr.Identity, }; } TableMList relationalTable = new TableMList(route.Type) { Name = GenerateTableNameCollection(table, name, Settings.FieldAttribute <TableNameAttribute>(route)), PrimaryKey = primaryKey, BackReference = new FieldReference(table.Type) { Name = GenerateBackReferenceName(table.Type, Settings.FieldAttribute <BackReferenceColumnNameAttribute>(route)), ReferenceTable = table, AvoidForeignKey = Settings.FieldAttribute <AvoidForeignKeyAttribute>(route) != null, }, Order = order, }; relationalTable.Field = GenerateField(relationalTable, route.Add("Item"), NameSequence.Void, forceNull: false, inMList: true); relationalTable.GenerateColumns(); return(new FieldMList(route.Type) { TableMList = relationalTable, }); }