I think I have a reproducer now. However, the difference in numbers is not as big as yours and does not change if I create UtilityNetwork with or without a map.
Electric Distribution Line Unique Elements `4052` vs Features From Elements `4066` (more features than elements)
Electric Distribution Junction Unique Elements `3334` vs Features From Elements `3334`
Electric Distribution Device Unique Elements `5045` vs Features From Elements `5425` (more features than elements)
var FeatureServerUrl = "https://sampleserver7.arcgisonline.com/arcgis/rest/services/UtilityNetwork/NapervilleElectric/FeatureServer";
var map = new Map(Basemap.CreateDarkGrayCanvasVector());
map.InitialViewpoint = new Viewpoint(InitialExtent);
map.OperationalLayers.Add(new FeatureLayer(new Uri($"{FeatureServiceUrl}/115")));
map.OperationalLayers.Add(new FeatureLayer(new Uri($"{FeatureServiceUrl}/110")));
map.OperationalLayers.Add(new FeatureLayer(new Uri($"{FeatureServiceUrl}/100")));
await map.LoadAsync();
_un = await UtilityNetwork.CreateAsync(new Uri(FeatureServiceUrl), map);
var networkSource = _un.Definition.GetNetworkSource("Electric Distribution Device");
var assetGroup = networkSource?.GetAssetGroup("Circuit Breaker");
var assetType = assetGroup?.GetAssetType("Three Phase");
var terminal = assetType?.TerminalConfiguration?.Terminals?.FirstOrDefault(t => t.Name == "Source");
var globalId = Guid.Parse("{B8493B23-B40B-4E3E-8C4B-0DD83C28D2CC}");
var element = _un.CreateElement(assetType, globalId, terminal);
var parameters = new UtilityTraceParameters(UtilityTraceType.Connected, new[] { element });
var result = await _un.TraceAsync(parameters);
if (result.FirstOrDefault() is UtilityElementTraceResult elementResult)
{
if (elementResult.Warnings.Count > 0)
MessageBox.Show(string.Join("\n", elementResult.Warnings), "Trace Result Warnings", MessageBoxButton.OK);
foreach (var layer in MyMapView.Map.OperationalLayers.OfType<FeatureLayer>())
{
var elements = elementResult.Elements.Where(el => el.NetworkSource.FeatureTable == layer.FeatureTable);
var features = await _un.GetFeaturesForElementsAsync(elements);
var distinctIds = (from f in elements select f.ObjectId).Distinct();
System.Diagnostics.Debug.WriteLine($"{layer.FeatureTable.DisplayName}\t:\t Unique Elements `{distinctIds.Count()}` vs Features From Elements `{features.Count()}`");
layer.SelectFeatures(features);
}
}
In your case, could there be layers that did not load or required credential? You can add the following to troubleshoot.
MyMapView.LayerViewStateChanged += (s, e) =>
{
var error = e.LayerViewState.Error ?? e.Layer.LoadError;
if (error != null)
System.Diagnostics.Debug.WriteLine($"{e.Layer.Name} had an error {error.Message}");
};
AuthenticationManager.Current.ChallengeHandler = new ChallengeHandler(async(info) =>
{
return await AuthenticationManager.Current.GenerateCredentialAsync(info.ServiceUri, "<username>", "<password>");
});