I'd like to incorporate this manual workflow into my dockpane, but I don't find any useful documentation or samples. Does anyone know if it is possible and if yes, how it can be done?
my manual workflow:
I open an enterprise geodatabase feature class in a map in ArcGIS Pro. Then I open layer properties and go to source. there is the field "Query" (not definition query!) containing something like this "select attribute 1, attribute 2, ..., attribute n FROM layername".
I then click on the pen on the right hand side and modify the query to "select * from layername".
I found this documentation: https://pro.arcgis.com/en/pro-app/latest/help/mapping/layer-properties/define-parameters-in-a-query-...
but I'm trying to do it in a dockpane for any layer that i add to my map using this method:
using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri(sde_path))))
{
//ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(featureClassDefinition.ToString(), "featureClassDefinition");
using (FeatureClass fc = geodatabase.OpenDataset<FeatureClass>("parcs." + name))
{
// Create the feature layer creation parameters
FeatureLayerCreationParams layerCreationParams = new FeatureLayerCreationParams(fc)
{
// Optionally set additional properties
Name = name
};
// Create the feature layer and add it to the active map
await QueuedTask.Run(() => LayerFactory.Instance.CreateLayer<FeatureLayer>(layerCreationParams, MapView.Active.Map));
}
}
how can i add the layer such that its query says "select * from layername"? any help is greatly appreciated.
Solved! Go to Solution.
Hi,
You can create layer with geoprocessing tool Make Query Layer. It creates a query layer from a DBMS table based on an input SQL select statement. So, you don't need your code above. How to call geoprocessing tool you can find here. Tool name for calling would be "management.MakeQueryLayer"
Have you looked into the QueryDescription Class, which is used to create a table or feature class representing a query layer?
Sample code snippets
Hi,
You can create layer with geoprocessing tool Make Query Layer. It creates a query layer from a DBMS table based on an input SQL select statement. So, you don't need your code above. How to call geoprocessing tool you can find here. Tool name for calling would be "management.MakeQueryLayer"
In line 16 when you have the layer it is pretty simple:
var queryName = "My Special Query";
var whereClause = "1 = 1";
layer.InsertDefinitionQuery(new DefinitionQuery(queryName, whereClause), true);
Since you are creating a new layer you don't have to check if the query already exist but that is also quite simple.
var q = layer.DefinitionQueries.SingleOrDefault(e => e.Name.Equals(queryName, StringComparison.CurrentCultureIgnoreCase));
Complete:
// Create the feature layer and add it to the active map
await QueuedTask.Run(() => {
var layer = LayerFactory.Instance.CreateLayer<FeatureLayer>(layerCreationParams, MapView.Active.Map)
var queryName = "My Special Query";
var whereClause = "1 = 1";
layer.InsertDefinitionQuery(new DefinitionQuery(queryName, whereClause), true);
});
Thank you, that code snippet works, but unfortunately it creates a definition query, whereas I meant the query under layer properties >> source >> query...
Here is a code snippet that creates a Query Layer - with the "SqlQuery" defined. Create a query layer
await QueuedTask.Run(() =>
{
Map map = MapView.Active.Map;
Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri(@"C:\Connections\mySDE.sde")));
CIMSqlQueryDataConnection sqldc = new CIMSqlQueryDataConnection()
{
WorkspaceConnectionString = geodatabase.GetConnectionString(),
GeometryType = esriGeometryType.esriGeometryPolygon,
OIDFields = "OBJECTID",
Srid = "102008",
SqlQuery = "select * from MySDE.dbo.STATES",
Dataset = "States"
};
var lcp = new LayerCreationParams(sqldc)
{
Name = "States"
};
FeatureLayer flyr = LayerFactory.Instance.CreateLayer<FeatureLayer>(lcp, map);
});