Skip To Content ArcGIS for Developers Sign In Dashboard

ArcGIS Runtime SDK for .NET

List related features

This code sample is available for these platforms:
View Sample on GitHub

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

  1. With a Feature, call QueryRelatedFeaturesAsync on the feature's feature table.
  2. 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


IdentifyLayerAsync, QueryRelatedFeaturesAsync, RelatedFeatureQueryResult, relationship, search and query

Sample Code

<?xml version="1.0" encoding="utf-8" ?>
            <RowDefinition Height="150" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        <ListView x:Name="MyResultsView" Grid.Row="0" />
            Text="Tap a park (green) to see related features." />
        <esriUI:MapView x:Name="MyMapView" Grid.Row="2" />
// 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:
// 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 System;
using System.Collections.Generic;
using System.Linq;
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Portal;
using Esri.ArcGISRuntime.Xamarin.Forms;
using Xamarin.Forms;
using Colors = System.Drawing.Color;

namespace ArcGISRuntime.Samples.ListRelatedFeatures
        "List related features",
        "This sample demonstrates how to query features related to an identified feature.",
        "Click on a feature to identify it. Related features will be listed in the window above the map.")]
    public partial class ListRelatedFeatures : ContentPage
        // URL to the web map
        private readonly Uri _mapUri =
            new Uri("");

        // Reference to the feature layer
        private FeatureLayer _myFeatureLayer;

        public ListRelatedFeatures()

            // Create the UI, setup the control references and execute initialization

        private async void Initialize()
                // 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();

                // Make the selection color yellow.
                MyMapView.SelectionProperties.Color = Colors.Yellow;

                // Listen for GeoViewTapped events
                MyMapView.GeoViewTapped += MyMapViewOnGeoViewTapped;
            catch (Exception e)
                await Application.Current.MainPage.DisplayAlert("Error", e.ToString(), "OK");

        private async void MyMapViewOnGeoViewTapped(object sender, GeoViewInputEventArgs e)
                // Clear any existing feature selection and results list
                MyResultsView.ItemsSource = null;

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

                Status.Text = "Loading...";

                // Get the first result
                ArcGISFeature myFeature = (ArcGISFeature)results.GeoElements.First();

                // Select the feature

                // 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 = $"{tableName} - {featureDisplayname}";

                        // Add the result to the list

                // Update the UI with the result list
                MyResultsView.ItemsSource = queryResultsForUi;
                Status.Text = "Tap a park (green) to see related features.";
            catch (Exception ex)
                await Application.Current.MainPage.DisplayAlert("Error", ex.ToString(), "OK");