List features related to the selected feature.
Use case
Related features are useful for managing relational information, like what you would store in a relational database management system (RDBMS). You can define relationship between records as one-to-one, one-to-many, or many-to-one. For example, you could model inspections and facilities as a many-to-one relationship. Then, for any facility feature, you could list related inspection features.
How to use the sample
Click on a feature to select it. The related features will be displayed in a list.
How it works
- With a
Feature
, callQueryRelatedFeaturesAsync
on the feature's feature table. - Iterate over the result's collection of
RelatedFeatureQueryResult
objects to get the related features and add them to a list.
Relevant API
- ArcGISFeature
- ArcGISFeatureTable
- FeatureQueryResult
- FeatureTable.QueryRelatedFeatures
- RelatedFeatureQueryResult
Tags
features, identify, query, related, relationship, search
Sample Code
// Copyright 2018 Esri. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. // You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific // language governing permissions and limitations under the License. using Esri.ArcGISRuntime.Data; using Esri.ArcGISRuntime.Mapping; using Esri.ArcGISRuntime.Portal; using Esri.ArcGISRuntime.UI.Controls; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.Windows; namespace ArcGIS.WPF.Samples.ListRelatedFeatures { [ArcGIS.Samples.Shared.Attributes.Sample( name: "List related features", category: "Data", description: "List features related to the selected feature.", instructions: "Click on a feature to select it. The related features will be displayed in a list.", tags: new[] { "features", "identify", "query", "related", "relationship", "search" })] public partial class ListRelatedFeatures { // Hold the URL of the web map. private readonly Uri _mapUri = new Uri("https://arcgisruntime.maps.arcgis.com/home/item.html?id=dcc7466a91294c0ab8f7a094430ab437"); // Reference to the feature layer. private FeatureLayer _myFeatureLayer; public ListRelatedFeatures() { InitializeComponent(); // Create the UI, setup the control references and execute initialization. _ = Initialize(); } private async Task Initialize() { try { // Create the portal item from the URL to the webmap. PortalItem alaskaPortalItem = await PortalItem.CreateAsync(_mapUri); // Create the map from the portal item. Map myMap = new Map(alaskaPortalItem); // Add the map to the mapview. MyMapView.Map = myMap; // Wait for the map to load. await myMap.LoadAsync(); // Get the feature layer from the map. _myFeatureLayer = (FeatureLayer)myMap.OperationalLayers.First(); // Wait for the layer to load. await _myFeatureLayer.LoadAsync(); // Make the selection color yellow. MyMapView.SelectionProperties.Color = Color.Yellow; // Listen for GeoViewTapped events. MyMapView.GeoViewTapped += MyMapViewOnGeoViewTapped; // Hide the loading indicator. LoadingProgress.Visibility = Visibility.Collapsed; } catch (Exception e) { MessageBox.Show(e.ToString(), "Error"); } } private async void MyMapViewOnGeoViewTapped(object sender, GeoViewInputEventArgs e) { // Clear any existing feature selection and results list. _myFeatureLayer.ClearSelection(); MyResultsView.ItemsSource = null; try { // Identify the tapped feature. IdentifyLayerResult results = await MyMapView.IdentifyLayerAsync(_myFeatureLayer, e.Position, 10, false); // Return if there are no results. if (results.GeoElements.Count < 1) { return; } // Show the loading indicator (this can take a while). LoadingProgress.Visibility = Visibility.Visible; // Get the first result. ArcGISFeature myFeature = (ArcGISFeature)results.GeoElements.First(); // Select the feature. _myFeatureLayer.SelectFeature(myFeature); // Get the feature table for the feature. ArcGISFeatureTable myFeatureTable = (ArcGISFeatureTable)myFeature.FeatureTable; // Query related features. IReadOnlyList<RelatedFeatureQueryResult> relatedFeaturesResult = await myFeatureTable.QueryRelatedFeaturesAsync(myFeature); // Create a list to hold the formatted results of the query. List<string> queryResultsForUi = new List<string>(); // For each query result. foreach (RelatedFeatureQueryResult result in relatedFeaturesResult) { // And then for each feature in the result. foreach (Feature resultFeature in result) { // Get a reference to the feature's table. ArcGISFeatureTable relatedTable = (ArcGISFeatureTable)resultFeature.FeatureTable; // Get the display field name - this is the name of the field that is intended for display. string displayFieldName = relatedTable.LayerInfo.DisplayFieldName; // Get the name of the feature's table. string tableName = relatedTable.TableName; // Get the display name for the feature. string featureDisplayname = resultFeature.Attributes[displayFieldName].ToString(); // Create a formatted result string. string formattedResult = string.Format("{0} - {1}", tableName, featureDisplayname); // Add the result to the list. queryResultsForUi.Add(formattedResult); } } // Update the UI with the result list. MyResultsView.ItemsSource = queryResultsForUi; // Hide the loading indicator. LoadingProgress.Visibility = Visibility.Collapsed; } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); } } } }