示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
 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;
 }
示例#4
0
 public MListExpression(Type type, Expression backID, TableMList tr)
     :base(DbExpressionType.MList, type)
 {
     this.BackID = backID;
     this.TableMList = tr;
 }
示例#5
0
 public FieldMList(PropertyRoute route, TableMList tableMList) : base(route)
 {
     this.TableMList = tableMList;
 }
示例#6
0
        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,
            });
        }