Search Example
- Last UpdatedJan 12, 2026
- 3 minute read
- PI System
- AF SDK 3.2.0
- Developer
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}