RUS  ENG 

Медленное получение элементов GetElement

Страницы: 1
RSS
Медленное получение элементов GetElement
 
Код
var result = NetworkLayer.NetworkTools.Results;  //25 ключей 
for (var i = 1; i <= result.Count; i++)
{
     var element = NetworkLayer.Elements.GetElement(result[i]);                
}
все это занимает 2 секунды. (без каких либо дополнительных действий в цикле)
если более быстрый способ получения объектов?

PS: ActiveX на C#
Изменено: Robert Portnov - 10.09.2018 14:37:22
 
Поэлементно читать данные с сервера действительно не очень быстрый сценарий. В среднем темпе. Зависит от сервера, скорости связи и т.д.

Более быстрый способ - это прочесать все объекты слоя, используя итератор, выбирая нужные. Но тогда нужно уметь быстро выбирать нужные
Код
Set En = NetworkLayer.EnumElements

En.MoveFirst

Do 
    
    If En.IsEOF then exit do        
        
    En.MoveNext
    
loop    
 
В таком случии поиск одного объекта может быть долгим, нужный мне объект может быть на любом шаге (MoveNext) даже последним.
А нет другого способа получить ключ и TypeID?
Изменено: Robert Portnov - 11.09.2018 09:14:26
 
Получить по ключу объект - GetElement Для одного объекта (тычок с карты) это быстро. А в цикле по одиночке вытащить несколько объектов, это дольше, чем по итератору. Зависит от количества.
25 объектов за две секунды как-то медленно. Пробовал, у нас - за две секунды тысячи полторы. Зависит от объема данных, многопользовательской нагрузки (сли кто=то эти данные параллельно меняет), качества соединения и т.д.
В любом случае, чем больше обращений к серверу, тем медленней.
Если речь о каких-то сверхскоростных решения, это нужно обсуждать отдельно. Делать особый запрос по группе ключей и создавать особый ответ в виде группы объектов.
Если по ключам нужно просто ID типа получить, можно попробовать SQL запрос
Код
Set response = L.ExecSQL ("SELECT sys,typeid WHERE sys=411344 or sys=495128 or sys=588061") 

Set ds = response.DataSet 

 ds.MoveFirst

 .................................

'Еще быстрее при большом количестве ключей:

Set response = L.ExecSQL ("SELECT sys,typeid WHERE sys IN (411344,495128,588061)")
 
Цитата
Robert Portnov написал:
В таком случии поиск одного объекта может быть долгим, нужный мне объект может быть на любом шаге (MoveNext) даже последним.
А нет другого способа получить ключ и TypeID?
Можно сперва создать группу по NetworkTools.Results и SQL запрос будет еще быстрее выполнить

Код
L.Selection.ModifyByKeys eSelCreate, L.NetworkTools.Results

Set response =  L.ExecSQL ("SELECT sys,typeid WHERE Geometry.Selected()=1")

Set ds = response.DataSet 

 ds.MoveFirst
 
Спасибо, Алексей!
Страницы: 1