public TagProps getTagProps(int id) { var sel1 = context.Properties.AsNoTracking().Where(c => c.ObjectId == id && c.PropId == 0).FirstOrDefault(); var sel2 = context.Objects.Find(id); var tagProps = new TagProps(); string JSONprop = sel1.Value; var props = json.Deserialize(JSONprop, tagProps.GetType()); tagProps = (TagProps)props; tagProps.Id = id; tagProps.Name = sel2.Name; return(tagProps); }
public void pasteNode(int copyNode, int newNode) { Objects rootCopy = copyObjects.Where(r => r.Id == copyNode).FirstOrDefault(); var rootCopyChilds = copyObjects.Where(r => r.ParentId == copyNode).ToList(); int childrenCount = rootCopyChilds.Count(); for (int i = 0; i < childrenCount; i++) { int currentIdd = ++baseId; copyObjects.Remove(rootCopy);//типа оптимизирую //проверка чтобы избежать бесконечной вставки набора копируемых узлов. if (rootCopyChilds[i].ParentId == nodePaste) return; Objects newPasteNode = new Objects() { Id = currentIdd, ParentId = newNode, Type = rootCopyChilds[i].Type, Name = rootCopyChilds[i].Name }; pasteObjects.Add(newPasteNode); Property rootPropsCopy = propertyList.Where(p => p.ObjectId == rootCopyChilds[i].Id).FirstOrDefault(); propertyList.Remove(rootPropsCopy);//типа оптимизирую string newPropJson = ""; //если у узла есть свойства if (rootPropsCopy.Value != "") { //поправим значение OpcID и Connection в строке свойств newPropJson = rootPropsCopy.Value; if (rootCopyChilds[i].Type == 2) { tagPropsForCopy = new TagProps(); tagPropsForCopy = (TagProps)json.Deserialize(rootPropsCopy.Value, tagPropsForCopy.GetType()); string newConnStr = tagPropsForCopy.Connection; string newConnStrRepl = newConnStr.Replace(oldControllerName, newControllerName); tagPropsForCopy.Opc = OPCIDglobal; tagPropsForCopy.Connection = newConnStrRepl; newPropJson = json.Serialize(tagPropsForCopy); } } //вставка строки со свойствами в таблицу свойств Property objProp = new Property { ObjectId = currentIdd, PropId = 0, Value = newPropJson }; pastePropertyList.Add(objProp); int nextParentId = 0; if (i == 0)//если это первый потомок, то просто наращиваем на 1 Id nextParentId = newNode + 1; else // если же последующие, то присваиваем макс Id для родителя nextParentId = pasteObjects.Last().Id; pasteNode(rootCopyChilds[i].Id, nextParentId); } }
public string pasteNodeRoot(int idPasteParentElem, int idCopyParentElem, string newContName) { pasteObjects = new List<Objects>(); pastePropertyList = new List<Property>(); nodePaste = idPasteParentElem; copyObjects = context.Objects.Where(o => o.Id >= idCopyParentElem).AsNoTracking().ToList();//попытка хоть немного уменьшить количество объектов по которым идет перебор propertyList = context.Properties.Where(p => p.PropId == 0 && p.ObjectId >= idCopyParentElem).AsNoTracking().ToList(); var rootCopy = copyObjects.Find(m => m.Id == idCopyParentElem);//корневой узел oldControllerName = rootCopy.Name; newControllerName = newContName;//название,которое ввел пользователь string Name = rootCopy.Name;//если узел конечный, то название оставим if (rootCopy.Type == 5 && newContName != "")//если же нет, то заменим на пользовательское { Name = newContName; } Property rootPropsCopy = propertyList.Find(p => p.ObjectId == idCopyParentElem); Objects newNode = new Objects() { Name = Name, Type = rootCopy.Type, ParentId = idPasteParentElem }; context.Objects.Add(newNode); context.SaveChanges(); baseId = newNode.Id;//От него будут отсчитываться последующие Id string newPropJson = ""; if (rootPropsCopy.Value != "") { newPropJson = rootPropsCopy.Value; string newConnSrtId = getConnectionProp(idPasteParentElem, out OPCIDglobal).Trim('/'); if (rootCopy.Type == 2) { tagPropsForCopy = new TagProps(); tagPropsForCopy = (TagProps)json.Deserialize(rootPropsCopy.Value, tagPropsForCopy.GetType()); tagPropsForCopy.Opc = OPCIDglobal; tagPropsForCopy.Connection = newConnSrtId; newPropJson = json.Serialize(tagPropsForCopy); } } Property objProp = new Property { ObjectId = newNode.Id, PropId = 0, Value = newPropJson }; context.Properties.Add(objProp); context.SaveChanges(); //Stopwatch sw = new Stopwatch(); //sw.Start(); pasteNode(idCopyParentElem, newNode.Id); int countPasteNodes = pasteObjects.Count(); context.Configuration.AutoDetectChangesEnabled = false; context.BulkInsert(pasteObjects); context.SaveChanges(); context.BulkInsert(pastePropertyList); context.SaveChanges(); //sw.Stop(); return CreateJsTreeHelp(newNode.Id); }