Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
        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
                }
            }
        }