Estoy tratando de utilizar el código siguiente para seleccionar las características que tienen los valores de atributo que me pase. El rendimiento es muy lento cuando se trata de una gran cantidad de valores de e.g >16k valores para que coincidan con las características.
Hay algo que me falta o una mejor manera de hacer esto?
// Suponiendo valores.Ninguna() es true:
var featureSelection = (layer as IFeatureSelection);
var whereClause = new StringBuilder();
var count = 0;
while (true)
{
var values = valuesToSelect.Skip(count*1000).Take(1000).ToList();
if (!values.Any()) break;
var thousandsClause = new StringBuilder();
foreach (var value in values)
{
thousandsClause.Append(",");
thousandsClause.Append(value);
}
thousandsClause.Remove(0, 1);
thousandsClause.Insert(0, fieldName + " IN (");
thousandsClause.Append(")");
whereClause.Append(" OR " + thousandsClause);
count++;
}
whereClause.Remove(0, 4);
IQueryFilter queryFilter = new QueryFilter();
queryFilter.WhereClause = whereClause.ToString();
featureSelection.SelectFeatures(queryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
featureSelection.SelectionChanged();
La muestra en la que EN las cláusulas:
122,072 valores para seleccionar
Editar--
Hasta ahora con las recomendaciones de algunos de los comentarios, he mejorado el código y los resultados son más rápidos pero todavía no es deseable. Aquí está el código que he comenzado a tratar el uso de la misma en la que EN la cláusula:
IQueryFilter queryFilter = new QueryFilter();
queryFilter.WhereClause = whereClause.ToString();
queryFilter.SubFields = "OBJECTID";
var featureLayer = layer as IFeatureLayer2;
if (featureLayer == null) continue;
IFeatureClass featureClass = featureLayer.FeatureClass;
var dataset = (IDataset) featureClass;
IWorkspace workSpace = dataset.Workspace;
ISelectionSet selectionSet = featureClass
.Select(queryFilter, esriSelectionType.esriSelectionTypeHybrid,esriSelectionOption.esriSelectionOptionNormal,workSpace);
var featureSelection = layer as IFeatureSelection;
if (featureSelection != null)
{
featureSelection.SelectionSet = selectionSet;
featureSelection.SelectionChanged();
}