Пример #1
0
 public static IEnumerable <EntityBuilder> ScanManyToManyRelation(SchemaBuildContext context)
 {
     return(context.EntityBuilders.Values
            .Where(eb => eb.ClrType != null)
            .SelectMany(eb => AttributesFromTypeResolver.ValidAttributesFromType(eb.ClrType))
            .Select(attr => attr.GetCustomAttribute(typeof(Attributes.ManyToMany)) as Attributes.ManyToMany)
            .Where(r => r != null)
            .Select(r => new EntityBuilder(context).FromManyToManyRelation(r)));
 }
Пример #2
0
        private void ScanForAttributes()
        {
            var attributesFromTypes = Context.EntityBuilders.Values
                                      .Select(eb => (eb, eb.ClrType))
                                      .Where(tup => tup.ClrType != null)
                                      .SelectMany(tuple =>
                                                  AttributesFromTypeResolver.ValidAttributesFromType(tuple.ClrType).Select(prop => (tuple.eb, prop)))
                                      .Select(tuple =>
                                              new AttributeBuilder(Context, Context.Entities[tuple.eb.EntityName]).FromProperty(tuple.prop))
                                      .GroupBy(ab => ab.Entity.EntityName)
                                      .ToDictionary(grp => grp.Key, grp => grp.ToDictionary(attr => attr.Name));

            foreach (var(key, value) in attributesFromTypes)
            {
                foreach (var(_, attributeBuilder) in value)
                {
                    Context.AttributeBuilders.GetOrInsert(key,
                                                          new Dictionary <string, AttributeBuilder>())[attributeBuilder.Name] = attributeBuilder;
                }
            }

            var attributesFromRelations = Context.AttributeBuilders.ToDictionary(kv => kv.Key, kv => kv.Value)
                                          .SelectMany(tup => tup.Value.Values.Select(vals => (Entity: tup.Key, Attribute: vals)))
                                          .Select(tup =>
                                                  (Entity: tup.Entity
                                                   , Relation: tup.Attribute.PropertyInfo.GetCustomAttribute(typeof(Relation)) as Relation
                                                  ))
                                          .Where(t => t.Relation != null)
                                          .FilterSelect(tup =>
                                                        new AttributeBuilder(Context, Context.Entities[tup.Entity]).FromRelation(tup.Relation))
                                          .DistinctBy(attr => (attr.Name, attr.Entity.EntityName))
                                          .GroupBy(ab => ab.Entity.EntityName)
                                          .ToDictionary(grp => grp.Key, grp => grp.ToDictionary(attr => attr.Name));

            foreach (var(key, value) in attributesFromRelations)
            {
                foreach (var(_, attributeBuilder) in value)
                {
                    var dict = Context.AttributeBuilders.GetOrInsert(key,
                                                                     new Dictionary <string, AttributeBuilder>());
                    if (dict.GetValueOrDefault(attributeBuilder.Name) == null)
                    {
                        dict[attributeBuilder.Name] = attributeBuilder;
                    }
                }
            }
        }