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))); }
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; } } } }