如何使用Linq to SQL和Linq to XML查询数据库列中的XML数据?

pau*_*aul 5 linq-to-xml linq-to-sql

XML:

<root>
    <item>
        <href>http://myurl</href>
    </item>
    <item>
        <href>http://myurl2</href>
    </item>
</root>
Run Code Online (Sandbox Code Playgroud)

XML数据存储在数据库表中.

我可以构建一个Linq查询来选择行,提取XML然后,例如,提取所有的href标签吗?最终结果将是所有选定行的所有URL的列表.

这是我的尝试,但它没有给我我想要的东西 - 这将是所有选定用户的所有href的列表.我只是得到一个空的IEnumerations列表.

var all = from bm in MYTABLE
        select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};

var docs = from x in all
        select XDocument.Parse(x.xml);
var href = from h in docs
        select h.Descendants("href");
Run Code Online (Sandbox Code Playgroud)


有2个问题.

- 我想只有在实际需要结果时才会执行查询.随着我从SQL进展到XML查询,生成的查询变成了SQL和XML的混合,因此是不可执行的.我的解决方案是通过将SQL查询转换为结果列表来强制执行结果.这将linq-sql与linq-xml分开.

var docs = from x in all
        select XDocument.Parse(x.xml);
var docs2 = docs.ToList();  // force result
Run Code Online (Sandbox Code Playgroud)

- 第二个问题是我忘了将命名空间添加到我的XML查询中.一旦我这样做,我得到了所需的结果

XNamespace ns = "http://acme/bookmarks";
var href = from h in docs2
    select h.Descendants(ns + "href");
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助!

mel*_*okb 1

这是一个使用您的代码和 的硬编码内容的代码片段MYTABLE,并且它运行完美(使用 LinqPad 进行了验证)。也许您的数据库表MYTABLE不包含您认为的内容?你能检查一下结果吗all

var MYTABLE = new  [] {
    new {
        SPP_USER_ID = "XML-SNIPPET-1",
        SPP_BOOKMARKS_XML = @"
        <root>
            <item>
                <href>http://myurl</href>
            </item>
            <item>
                <href>http://myurl2</href>
            </item>
        </root>
        ",
    },
    new {
        SPP_USER_ID = "XML-SNIPPET-2",
        SPP_BOOKMARKS_XML = @"
        <root>
            <item>
                <href>http://google.com</href>
            </item>
        </root>
        ",
    }
};

var all = from bm in MYTABLE
        select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};

var docs = from x in all
        select XDocument.Parse(x.xml);
var href = from h in docs
        select h.Descendants("href");

foreach (var h in href.SelectMany(h => h))
{
    Console.WriteLine(h);
}
Run Code Online (Sandbox Code Playgroud)

输出:

<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!