Search Example
- Last UpdatedNov 18, 2025
- 5 minute read
- PI System
- AF SDK 2024 R2
- 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}
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.