고유 키가있는 XML 테이블에 레코드 삽입
-
18-09-2019 - |
문제
어쩌면 SQL에 의해 망쳐졌지만 새 레코드를 "XML 테이블"에 삽입하고 인덱스 된 ID 업데이트를 자동으로 (또는 적어도 반자동 적으로) 할 수있는 멋진 LINQ 방법이 있습니까?
다음은 "XML 테이블"이라는 의미입니다.
<myElements>
<myElement>
<id>1</id>
<value>blah</value>
</myElement>
<myElement>
<id>3</id>
<value>blah</value>
</myElement>
<myElement>
<id>4</id>
<value>blah</value>
</myElement>
<myElement>
<id>8</id>
<value>blah</value>
</myElement>
<myElement>
<id>9</id>
<value>blah</value>
</myElement>
</myElements>
이 경우 표는 "골수"이고 레코드는 "골수"요소 (즉, 골수의 어린이)입니다.
"ID"요소는 스키마의 키로 정의되므로 SQL에서와 마찬가지로 "기본 키"로 작용합니다.
따라서 내 질문은 "value"요소가 "무엇이든"이고 "ID"요소가 다음 사용 가능한 ID로 자동으로 설정되는 새로운 "myelement"를 어떻게 삽입 하는가입니다 (이 예에서는 max (id)가됩니다. ) + 1 = 10).
XML 데이터베이스가 XDocument에 저장되어 있으므로 LINQ 및/또는 XELENTE의 방법을 사용하는 솔루션을 원합니다.
감사!
해결책
글쎄, 모든 테이블에는 "ID"라는 요소가 있기 때문에 상당히 일반적인 getNextAvailableID 요소를 쓸 수있었습니다. 따라서 여기 내 삽입 루틴이 "Myelement"테이블에서 작동하는 방법이 있습니다.
public virtual int InsertMyElement(string value)
{
int id = GetNextAvailableId("myElement");
TableDictionary["myElement"].Add(
new XElement(_ns + "myElement",
new XElement(_ns + "id", id),
new XElement(_ns + "value", value)));
return id;
}
public virtual int GetNextAvailableId(string tableName)
{
IEnumerable<int> ids =
from
r in TableDictionary[tableName].Elements()
select
int.Parse(r.Element(_ns + "id").Value);
return ids.Max() + 1;
}
나는이 솔루션에 대해 너무 크게 느끼지 않습니다. "ID"외에 내 ID를 호출하기로 결정하면 깨질 것입니다. 그러나 지금은 효과가있는 것 같습니다.
댓글을 환영합니다.
제휴하지 않습니다 StackOverflow