Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C# by ctacoh ( 17 years ago )
public static class DataContextWalker
    {
        public static List<MetaAssociation> GetRelations(DataContext dc, Type outerType, Type innerType)
        {
            return GetRelations(dc, outerType, innerType, null);
        }
        public static List<MetaAssociation> GetRelations(DataContext dc, Type outerType, Type innerType, List<Type> exceptTypes)
        {
            if ( null == exceptTypes )
            {
                exceptTypes = new List<Type>();
            }
            if (innerType == outerType)
            {
                return null;
            }
            MetaModel mm = dc.Mapping;
            MetaTable outerTable = mm.GetTable(outerType);
            if (null == outerTable)
            {
                return null;
            }
            MetaTable innerTable = mm.GetTable(innerType);
            if (null == innerTable)
            {
                return null;
            }
            List<MetaAssociation> usedAssociations = new List<MetaAssociation>();
            Relation relation = new Relation(null, null);
            foreach (MetaAssociation association in outerTable.RowType.Associations.Where( a => !exceptTypes.Contains(a.OtherMember.Type) ))
            {
                Relation childRelation = new Relation(relation, association);
            }
            Relation foundedRelation = _getRelation(relation.Childs, innerTable.RowType, usedAssociations, exceptTypes);


            if (null == foundedRelation)
            {
                return null;
            }
            else
            {
                return foundedRelation.GetAssociations();
            }
        }

        private static Relation _getRelation(IEnumerable<Relation> relations, MetaType innerType, List<MetaAssociation> usedAssociations, List<Type> exceptTypes)
        {
            List<Relation> childRelations = new List<Relation>();
            foreach (Relation relation in relations)
            {
                if (relation.Association.OtherType.Equals(innerType))
                {
                    return relation;
                }
                else
                {
                    usedAssociations.Add(relation.Association);
                    foreach (MetaAssociation childAssociation in relation.Association.OtherType.Associations.Where(a => !usedAssociations.Contains(a) && !usedAssociations.Contains(a.OtherMember.Association) && !exceptTypes.Contains(a.OtherMember.Type) ))
                    {

                        Relation childRelation = new Relation(relation, childAssociation);
                        childRelations.Add(childRelation);
                    }
                }
            }
            if (0 == childRelations.Count())
            {
                return null;
            }
            else
            {
                return _getRelation(childRelations, innerType, usedAssociations, exceptTypes);
            }
        }

        private class Relation
        {
            private readonly Relation _parent;
            private List<Relation> _childs;

            public Relation(Relation parent, MetaAssociation association)
            {
                _parent = parent;
                if (null != _parent)
                {
                    _parent._childs.Add(this);
                }
                _childs = new List<Relation>();
                _association = association;
            }

            public IEnumerable<Relation> Childs
            {
                get { return _childs; }
            }

            private readonly MetaAssociation _association;
            public System.Data.Linq.Mapping.MetaAssociation Association
            {
                get { return _association; }
            }

            public List<MetaAssociation> GetAssociations()
            {
                return _getAssociations(new List<MetaAssociation>());
            }

            private List<MetaAssociation> _getAssociations(List<MetaAssociation> associations)
            {
                if (null != _parent)
                {
                    associations.Add(Association.OtherMember.Association);
                    _parent._getAssociations(associations);
                }
                return associations;
            }
        }
    }

 

Revise this Paste

Your Name: Code Language: