簡體   English   中英

XDocument C#加入

[英]XDocument C# Join

我必須使用XDocument將聯接用於以下xml

<Books>
    <Book>
        <Name id="1">Test</Name>
        <CardNo>1234</CardNo>
    </Book>
    <Book>
        <Name id="1">Test</Name>
        <CardNo>5678</CardNo>
    </Book>
    <Library>
        <RackNo>4</RackNo>
        <SampleData>Hello</SampleData>
        <CardNo>1234</CardNo>
    </Library>
    <Library>
        <RackNo>5</RackNo>
        <SampleData>John</SampleData>
        <CardNo>5678</CardNo>
    </Library>
</Books>

在上面的示例中,我需要加入CardNo,但是它們存在於兩個不同的Records ..下,即Library和Book。 我正在使用此代碼,但該聯接不適用於XDocument。 有什么建議嗎?

 var bookRecords = from c in doc.Element("Books").Element("Book")
                   select new { bookCardNo = c.Attribute("CardNo").Value }

var LibraryRecords = from d in doc.Element("Books").Element("Library")
                   select new { libCardNo = d.Attribute("CardNo").Value }

var groupedRecords = 
    from br in bookRecords
    join lr in LibraryRecords 
    on br.bookCardNo equals lr.libCardNo
    select new { rackno = lr.Element("RackNo").Value }

首先,您要查詢多個元素,因此需要Elements而不是Element Element將僅返回第一項,因此您的LINQ表達式將不會編譯。

其次,沒有稱為CardNo 屬性 CardNoelement

最后, LibraryRecords將包含一堆匿名對象。 如果要訪問RackNo或任何其他屬性,則需要將其值包含為該對象的屬性。

var bookRecords =
    from book in doc.Elements("Books").Elements("Book")
    select new
    {
        Name = (string) book.Element("Name"),
        CardNo = (string) book.Element("CardNo")
    };

var libraryRecords =
    from lib in doc.Elements("Books").Elements("Library")
    select new
    {
        CardNo = (string) lib.Element("CardNo"),
        RackNo = (string) lib.Element("RackNo"),
    };

var groupedRecords =
    from br in bookRecords
    join lr in libraryRecords
    on br.CardNo equals lr.CardNo
    select new
    {
        br.Name,
        lr.RackNo
    };

看到這個小提琴演示。

根據顯示的xml模式,庫與書籍處於同一級別,如果使用Descendants方法,而不是Attribute ,則使用Element會更容易,因為在兩種情況下CardNo都不是屬性:

var bookRecords = from c in doc.Descendants("Book")
                   select new { bookCardNo = c.Element("CardNo").Value };

var LibraryRecords = from d in doc.Descendants("Library")
                     select new { libCardNo = d.Element("CardNo").Value,
                                  rackno = d.Element("RackNo").Value  };

var groupedRecords = 
    from br in bookRecords
    join lr in LibraryRecords 
    on br.bookCardNo equals lr.libCardNo
    select lr.rackno;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM