For Each livm As LayerItemViewModel In esriLegend.LayerItems If TypeOf livm.Layer Is ArcGISDynamicMapServiceLayer Then Dim agdsl As ArcGISDynamicMapServiceLayer = CType(livm.Layer, ArcGISDynamicMapServiceLayer) Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True And x.SubLayerIds Is Nothing Select x.ID).ToList Dim gl As List(Of LayerInfo) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = False And x.SubLayerIds IsNot Nothing).ToList For Each li As LayerInfo In gl For Each i As Integer In li.SubLayerIds dvl.Remove(i) Next Next agdsl.VisibleLayers = dvl.ToArray End If Next
Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True Select x.ID).ToList agdsl.VisibleLayers = dvl.ToArray
That being said, my feeling is that you shoud get the expected result with code like:Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True Select x.ID).ToList agdsl.VisibleLayers = dvl.ToArray
var ids = new List<int>();
var parentLayers = _dmsl.Layers.Where(x => x.SubLayerIds != null).ToArray();
foreach (var l in _dmsl.Layers)
{
    if (parentLayers.Contains(l) && l.DefaultVisibility)
    {
        ids.Add(l.ID);
    }
    else
    {
        //find the parent of the child layer
        var pl = parentLayers.Where(x => x.SubLayerIds.Contains(x.ID)).FirstOrDefault();
        //iterate through parent layers until we reached the outermost parent
        while (parentLayers.Contains(pl))
        {
            var tempPl = parentLayers.Where(x => x.SubLayerIds.Contains(pl.ID)).FirstOrDefault();
            if (tempPl == null)
                break;
            else
                pl = tempPl;
        }
        //determine if the layer should be visible
        if (pl != null)
        {
            if (pl.DefaultVisibility && l.DefaultVisibility)
                ids.Add(l.ID);
        }
    }
}