Beispiel #1
0
        internal List <HierarchyRow> GetRelationshipChildrenFromLayer(BasicFeatureLayer member,
                                                                      long objectID)
        {
            var children = new List <HierarchyRow>();

            CIMBasicFeatureLayer bfl = member.GetDefinition() as CIMBasicFeatureLayer;
            var relates = bfl.FeatureTable.Relates;

            if (relates == null || relates.Length == 0)
            {
                return(children);
            }

            foreach (var relate in relates)
            {
                if (!(relate.DataConnection is CIMStandardDataConnection) &&
                    !(relate.DataConnection is CIMFeatureDatasetDataConnection))
                {
                    continue;//Not supported in this sample
                }
                var sdc     = relate.DataConnection as CIMStandardDataConnection;
                var fdc     = relate.DataConnection as CIMFeatureDatasetDataConnection;
                var factory = sdc?.WorkspaceFactory ?? fdc.WorkspaceFactory;
                var path    = sdc?.WorkspaceConnectionString ?? fdc.WorkspaceConnectionString;
                if (string.IsNullOrEmpty(path))
                {
                    continue;//No connection information we can use
                }
                path = path.Replace("DATABASE=", "");
                var dstype = sdc?.DatasetType ?? fdc.DatasetType;

                if (dstype != esriDatasetType.esriDTFeatureClass &&
                    dstype != esriDatasetType.esriDTTable)
                {
                    continue;//Not supported in the sample
                }

                var dsname          = sdc?.Dataset ?? fdc.Dataset;
                var featDatasetName = fdc?.FeatureDataset ?? "";

                Geodatabase gdb = null;
                if (factory == WorkspaceFactory.FileGDB)
                {
                    gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(path, UriKind.Absolute)));
                }
                else if (factory == WorkspaceFactory.SDE)
                {
                    gdb = new Geodatabase(new DatabaseConnectionFile(new Uri(path, UriKind.Absolute)));
                }

                Table table = null;
                //We have to open a type specific dataset - FeatureClass or Table
                //We cannot simply use 'Table' for both
                if (dstype == esriDatasetType.esriDTFeatureClass)
                {
                    table = GetDatasetFromGeodatabase <FeatureClass>(gdb, dsname, featDatasetName);
                }
                else
                {
                    table = GetDatasetFromGeodatabase <Table>(gdb, dsname, featDatasetName);
                }
                if (table == null)
                {
                    continue;//Related dataset not found
                }
                //Get any related rows
                var qry_fld = table.GetDefinition().GetFields().FirstOrDefault(f => f.Name == relate.ForeignKey);
                if (qry_fld == null)
                {
                    continue;//We cannot find the designated foreign key
                }
                //Load relevant values
                var inspector = new Inspector();
                inspector.Load(member, objectID);

                var need_quotes = qry_fld.FieldType == FieldType.String;
                var quote       = need_quotes ? "'" : "";
                var where = $"{relate.ForeignKey} = {quote}{inspector[relate.PrimaryKey]}{quote}";
                var qf = new QueryFilter()
                {
                    WhereClause = where,
                    SubFields   = $"{table.GetDefinition().GetObjectIDField()}, {relate.ForeignKey}"
                };

                var childHRow = new HierarchyRow()
                {
                    name = dsname,
                    type = $"{inspector[relate.PrimaryKey]}"
                };

                using (var rc = table.Search(qf))
                {
                    while (rc.MoveNext())
                    {
                        using (var row = rc.Current)
                        {
                            var id   = row.GetObjectID();
                            var HRow = new HierarchyRow()
                            {
                                name = $"{id}",
                                type = relate.ForeignKey
                            };
                            childHRow.children.Add(HRow);
                        }
                    }
                }
                children.Add(childHRow);
            }
            return(children);
        }