protected static ResultNode ToResultNode(TempTableNode node) { ResultNode resultNode; if (node is EntityTempNode) { resultNode = new EntityResultNode(node.Name, node.Select, node.Table, node.RelatedKey, node.Entity); } else if (node is CollectionTempNode) { CollectionTempNode collectionTempNode = node as CollectionTempNode; resultNode = new CollectionResultNode(node.Name, node.Select, collectionTempNode.OrderBy, node.Table, node.RelatedKey, collectionTempNode.Entity); } else { throw new NotSupportedException(node.GetType().ToString()); // never } resultNode.Path = node.Path; List <ResultNode> resultChildren = new List <ResultNode>(); foreach (TempTableNode child in node.Children) { resultChildren.Add(ToResultNode(child)); } resultNode.Children = resultChildren.ToArray(); return(resultNode); }
private void Compose(ResultNode resultNode, DataRowNode rowNode) { foreach (ResultNode childResult in resultNode.Children) { List <object> key = new List <object>(); foreach (string relatedKey in childResult.RelatedKey.Keys) { key.Add(rowNode.Row[relatedKey]); } DataRowView[] rowViews = childResult.Table.DefaultView.FindRows(key.ToArray()); if (childResult is EntityResultNode) { if (rowViews.Length == 0) { rowNode.ChildDict.Add(childResult.Name, null); return; } // Assert(rowViews.Length == 1) DataRowNode childRow = Convert(rowViews[0].Row); rowNode.ChildDict.Add(childResult.Name, childRow); Compose(childResult, childRow); } else if (childResult is CollectionResultNode) { IEnumerable <DataRow> rows = rowViews.Select(p => p.Row); CollectionResultNode collectionResultNode = childResult as CollectionResultNode; rows = Order(rows, collectionResultNode.OrderBy); List <DataRowNode> children = new List <DataRowNode>(); foreach (DataRow row in rows) { children.Add(Convert(row, collectionResultNode.Entity)); } rowNode.ChildrenDict.Add(childResult.Name, children); foreach (DataRowNode childRow in children) { Compose(childResult, childRow); } } else { throw new NotSupportedException(childResult.GetType().ToString()); // never } } }