private static IEnumerable <ODataExpandAssociation> MergeExpandAssociations(ODataExpandAssociation first, ODataExpandAssociation second)
        {
            if (first.Name != second.Name && first.Name != "*")
            {
                return new [] { first, second }
            }
            ;

            var result = first.Clone();

            result.OrderByColumns.AddRange(second.OrderByColumns.Except(first.OrderByColumns));
            result.ExpandAssociations.Clear();
            var groupedExpandAssociations = first.ExpandAssociations
                                            .Concat(second.ExpandAssociations)
                                            .GroupBy(x => x);
            var mergedExpandAssociations = groupedExpandAssociations
                                           .Select(x =>
            {
                var mainAssociation = x.Key;
                foreach (var association in x.Where(a => a != mainAssociation))
                {
                    mainAssociation = MergeExpandAssociations(mainAssociation, association).First();
                    mainAssociation.OrderByColumns.AddRange(association.OrderByColumns.Except(mainAssociation.OrderByColumns));
                }
                return(mainAssociation);
            });

            result.ExpandAssociations.AddRange(mergedExpandAssociations);

            return(new [] { result });
        }
Exemple #2
0
        public void CloneProducesNewObjects()
        {
            var association = new ODataExpandAssociation("Products")
            {
                ExpandAssociations = { new ODataExpandAssociation("Category") }
            };

            var clonedAssociation = association.Clone();

            Assert.NotSame(association, clonedAssociation);
            Assert.NotSame(association.ExpandAssociations.First(), clonedAssociation.ExpandAssociations.First());
        }
        private static ODataExpandAssociation MergeOrderByColumns(ODataExpandAssociation expandAssociation, KeyValuePair <string, bool> orderByColumn)
        {
            if (string.IsNullOrEmpty(orderByColumn.Key))
            {
                return(expandAssociation);
            }

            var segments = orderByColumn.Key.Split('/');

            if (segments[0] != expandAssociation.Name)
            {
                return(expandAssociation);
            }

            var result = expandAssociation.Clone();

            MergeOrderByColumns(result, segments, orderByColumn.Value, 1);
            return(result);
        }