문제

어쩌면 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를 호출하기로 결정하면 깨질 것입니다. 그러나 지금은 효과가있는 것 같습니다.

댓글을 환영합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top