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 UpdatedJan 12, 2026
  • 3 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}

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