Please ensure Javascript is enabled for purposes of website accessibility
Powered by Zoomin Software. For more details please contactZoomin

AF SDK Reference

Search Example

  • Last UpdatedNov 18, 2025
  • 5 minute read
Search Example

The following examples show how to search for assets (elements and their attributes) using the AF SDK. The examples show different search criteria and how to search through results when the result set is large. Calling these AF SDK methods allow the server to process the search instead of writing custom search logic on the client.

Starting with AF 2016 (2.8), search query methods are available that process query strings instead of methods for each type of search. In these examplse the AFElementSearch class is used.

  1void Search_Program(string dbName)
  2{
  3    // Get the Database
  4    PISystems myPISystems = new PISystems();
  5    PISystem myPISystem = myPISystems.DefaultPISystem;
  6    if (myPISystem == null)
  7        throw new InvalidOperationException("Default PISystem was not found.");
  8    AFDatabase myDB = myPISystem.Databases[dbName];
  9    if (myDB == null)
 10        throw new InvalidOperationException("Database was not found.");
 11
 12    // Perform several searches
 13    FindTanksByName(myDB, "Tank*");
 14    FindTanksByTemplate(myDB, "Tank");
 15    FindTanksByLocation(myDB, "Texas");
 16    FindTanksAboveLevel(myDB, 50);
 17    FindTankLocations(myDB, "TankAdvanced");
 18}
 19
 20static void FindTanksByName(AFDatabase database, string elementNameFilter)
 21{
 22    Console.WriteLine("Find Tanks by Name: {0}", elementNameFilter);
 23
 24    // Default search is as an element name string mask. 
 25    string querystring = string.Format("{0}", elementNameFilter);
 26    using (AFElementSearch elementquery = new AFElementSearch(database, "ElementSearch", querystring))
 27    {
 28        elementquery.CacheTimeout = TimeSpan.FromMinutes(10);
 29
 30        foreach (AFElement element in elementquery.FindObjects())
 31        {
 32            Console.WriteLine("Element: {0}, Template: {1}, Categories: {2}",
 33                element.Name, element.Template.Name, element.CategoriesString);
 34        }
 35    }
 36    Console.WriteLine();
 37}
 38
 39static void FindTanksByTemplate(AFDatabase database, string templateName)
 40{
 41    Console.WriteLine("Find Tanks by Template: {0}", templateName);
 42
 43    int countderived = 0;
 44    using (AFElementSearch elementquery = new AFElementSearch(database, "TemplateSearch", string.Format("Template:\"{0}\"", templateName)))
 45    {
 46        AFElementSearch templatefilter = new AFElementSearch(database, "DerivedTemplates", "TemplateName:\"TankAdvanced\"");
 47        elementquery.CacheTimeout = TimeSpan.FromMinutes(10);
 48
 49        foreach (AFElement element in elementquery.FindObjects())
 50        {
 51            Console.WriteLine("Element: {0}, Template: {1}", element.Name, element.Template.Name);
 52            if (templatefilter.IsMatch(element))
 53                countderived++;
 54        }
 55    }
 56    Console.WriteLine("   Found {0} derived templates", countderived);
 57    Console.WriteLine();
 58}
 59
 60static void FindTanksByLocation(AFDatabase database, string location)
 61{
 62    Console.WriteLine("Find Tanks by Location: {0}", location);
 63
 64    string templateName = "Tank";
 65    string attributeName = "Location";
 66    using (AFElementSearch elementquery = new AFElementSearch(database, "AttributeValueEQSearch",
 67         string.Format("template:\"{0}\" \"|{1}\":\"{2}\"", templateName, attributeName, location)))
 68    {
 69        elementquery.CacheTimeout = TimeSpan.FromMinutes(10);
 70
 71        int countNames = 0;
 72        foreach (AFElement element in elementquery.FindObjects())
 73        {
 74            Console.Write("{0}{1}", countNames++ == 0 ? string.Empty : ", ", element.Name);
 75        }
 76    }
 77    Console.WriteLine("\n");
 78}
 79
 80static void FindTanksAboveLevel(AFDatabase database, double val)
 81{
 82    Console.WriteLine("Find Tanks above Level: {0}", val);
 83
 84    string templateName = "Tank";
 85    string attributeName = "Level";
 86    using (AFElementSearch elementquery = new AFElementSearch(database, "AttributeValueGTSearch",
 87        string.Format("template:\"{0}\" \"|{1}\":>{2}", templateName, attributeName, val)))
 88    {
 89        elementquery.CacheTimeout = TimeSpan.FromMinutes(10);
 90
 91        int countNames = 0;
 92        foreach (AFElement element in elementquery.FindObjects())
 93        {
 94            Console.Write("{0}{1}", countNames++ == 0 ? string.Empty : ", ", element.Name);
 95        }
 96    }
 97    Console.WriteLine("\n");
 98}
 99
100static void FindTankLocations(AFDatabase database, string templateName)
101{
102    Console.WriteLine("Find Tank Locations: {0}", templateName);
103
104    int countAttrs = 0;
105    using (AFAttributeSearch attrquery = new AFAttributeSearch(database, "AttributeLocationSearch",
106        string.Format("Element:{{Template:\"{0}\" Root:NorthPlant AllDescendants:true}} Category:Location", templateName)))
107    {
108        attrquery.CacheTimeout = TimeSpan.FromMinutes(10);
109
110        foreach (AFAttribute attr in attrquery.FindObjects())
111        {
112            Console.Write("{0}{1}", countAttrs++ == 0 ? string.Empty : ", ", attr.GetValue());
113        }
114    }
115    Console.WriteLine();
116    Console.WriteLine("Found {0} attributes.", countAttrs);
117    Console.WriteLine();
118}
  1Private Sub Search_Program(dbName As String)
  2    ' Get the Database
  3    Dim myPISystems As New PISystems()
  4    Dim myPISystem As PISystem = myPISystems.DefaultPISystem
  5    If myPISystem Is Nothing Then
  6        Throw New InvalidOperationException("Default PISystem was not found.")
  7    End If
  8    Dim myDB As AFDatabase = myPISystem.Databases(dbName)
  9    If myDB Is Nothing Then
 10        Throw New InvalidOperationException("Database was not found.")
 11    End If
 12
 13    ' Perform several searches
 14    FindTanksByName(myDB, "Tank*")
 15    FindTanksByTemplate(myDB, "Tank")
 16    FindTanksByLocation(myDB, "Texas")
 17    FindTanksAboveLevel(myDB, 50)
 18    FindTankLocations(myDB, "TankAdvanced")
 19End Sub
 20
 21Private Shared Sub FindTanksByName(database As AFDatabase, elementNameFilter As String)
 22    Console.WriteLine("Find Tanks by Name: {0}", elementNameFilter)
 23
 24    ' Default search is as an element name string mask. 
 25    Dim querystring As String = String.Format("{0}", elementNameFilter)
 26    Using elementquery As New AFElementSearch(database, "ElementSearch", querystring)
 27        elementquery.CacheTimeout = TimeSpan.FromMinutes(10)
 28
 29        For Each element As AFElement In elementquery.FindObjects()
 30            Console.WriteLine("Element: {0}, Template: {1}, Categories: {2}",
 31                              element.Name, element.Template.Name, element.CategoriesString)
 32        Next
 33    End Using
 34    Console.WriteLine()
 35End Sub
 36
 37Private Shared Sub FindTanksByTemplate(database As AFDatabase, templateName As String)
 38    Console.WriteLine("Find Tanks by Template: {0}", templateName)
 39
 40    Dim countderived As Integer = 0
 41    Using elementquery As New AFElementSearch(database, "TemplateSearch", String.Format("Template:""{0}""", templateName))
 42        elementquery.CacheTimeout = TimeSpan.FromMinutes(10)
 43
 44        Dim templatefilter As New AFElementSearch(database, "DerivedTemplates", "TemplateName:""TankAdvanced""")
 45        For Each element As AFElement In elementquery.FindObjects()
 46            Console.WriteLine("Element: {0}, Template: {1}", element.Name, element.Template.Name)
 47            If templatefilter.IsMatch(element) Then
 48                countderived += 1
 49            End If
 50        Next
 51    End Using
 52
 53    Console.WriteLine("   Found {0} derived templates", countderived)
 54    Console.WriteLine()
 55End Sub
 56
 57Private Shared Sub FindTanksByLocation(database As AFDatabase, substationLocation As String)
 58    Console.WriteLine("Find Tanks by Location: {0}", substationLocation)
 59
 60    Dim templateName As String = "Tank"
 61    Dim attributeName As String = "Location"
 62    Using elementquery As New AFElementSearch(database, "AttributeValueEQSearch",
 63                String.Format("template:""{0}"" ""|{1}"":""{2}""", templateName, attributeName, substationLocation))
 64        elementquery.CacheTimeout = TimeSpan.FromMinutes(10)
 65
 66        Dim countNames As Integer = 0
 67        For Each element As AFElement In elementquery.FindObjects()
 68            countNames += 1
 69            If countNames = 0 Then
 70                Console.Write(", {0}", element.Name)
 71            Else
 72                Console.Write(element.Name)
 73            End If
 74        Next
 75    End Using
 76
 77    Console.WriteLine(vbLf)
 78End Sub
 79
 80Private Shared Sub FindTanksAboveLevel(database As AFDatabase, val As Double)
 81    Console.WriteLine("Find Tanks above Level: {0}", val)
 82
 83    Dim templateName As String = "Tank"
 84    Dim attributeName As String = "Level"
 85    Dim elementquery As New AFElementSearch(database, "AttributeValueGTSearch",
 86                String.Format("template:""{0}"" ""|{1}"":>{2}", templateName, attributeName, val))
 87    elementquery.CacheTimeout = TimeSpan.FromMinutes(10)
 88
 89    Dim countNames As Integer = 0
 90    For Each element As AFElement In elementquery.FindObjects()
 91        countNames += 1
 92        If countNames = 0 Then
 93            Console.Write(", {0}", element.Name)
 94        Else
 95            Console.Write(element.Name)
 96        End If
 97    Next
 98
 99    Console.WriteLine(vbLf)
100End Sub
101
102Private Shared Sub FindTankLocations(database As AFDatabase, templateName As String)
103    Console.WriteLine("Find Tank Locations: {0}", templateName)
104
105    Dim countAttrs As Integer = 0
106    Using attrquery As New AFAttributeSearch(database, "AttributeLocationSearch",
107                String.Format("Element:{{Template:""{0}"" Root:NorthPlant AllDescendants:true}} Category:Location", templateName))
108        attrquery.CacheTimeout = TimeSpan.FromMinutes(10)
109
110        For Each attr As AFAttribute In attrquery.FindObjects()
111            countAttrs += 1
112            If countAttrs = 0 Then
113                Console.Write(", {0}", attr.GetValue())
114            Else
115                Console.Write(attr.GetValue())
116            End If
117        Next
118    End Using
119
120    Console.WriteLine("Found {0} attributes.", countAttrs)
121    Console.WriteLine()
122End Sub

No code example is currently available or this language may not be supported.

No code example is currently available or this language may not be supported.

Related Links
TitleResults for “How to create a CRG?”Also Available in