سؤال

ربما أنا مدلل فقط بواسطة SQL، ولكن هناك بعض طريقة LinQ رائعة لإدراج سجل جديد في "جدول XML" ولدي تحديث المعرف المفهرس تلقائيا (أو على الأقل شبه تلقائيا)؟

إليك ما أقصده "جدول 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>

في هذه الحالة، يكون الجدول "myeLements" والسجلات هي عناصر "MyLement" (أي أطفال الناعمة).

يتم تعريف عنصر "معرف" على أنه مفتاح في المخطط، لذلك يتصرف أكثر أو أقل ك "مفتاح أساسي"، تماما كما لو كان في SQL.

لذلك، سؤالي هو، كيف يمكنني إدراج "MyLement" جديد حيث "قيمة" عنصر "مهما كان" ويتم تعيين عنصر "المعرف" تلقائيا على المعرف التالي المتاح (في هذا المثال، سيكون الحد الأقصى (ID ) + 1 = 10).

لدي قاعدة بيانات XML الخاصة بي المخزنة في XDocument، لذلك أود الحل الذي يستخدم LinQ و / أو طرق Xelement.

شكرا!

هل كانت مفيدة؟

المحلول

حسنا، نظرا لأن جميع طاولاتي لها عنصر يسمى "ID"، كنت قادرا على كتابة عنصر GetnextAxailable عام إلى حد ما. لذلك، إليك كيفية عمل روتين الإدراج الخاص بي من أجل جدول "MyLement".

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;
}

لا أشعر بشعيرة للغاية حول هذا الحل - فسيكون من الاستراحة إذا قررت استدعاء معرفي شيء إلى جانب "معرف" - ولكن يبدو أنه سيعمل الآن.

تعليقات مرحبا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top