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