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

Linq to sql 如何使用LINQtoSQL和LINQtoXML查询数据库列中的XML数据?,linq-to-sql,linq-to-xml,Linq To Sql,Linq To Xml,XML: 解决方案 有两个问题 -我猜只有在实际需要结果时才会执行查询。当我从SQL发展到XML查询时,结果查询变成了SQL和XML的混合,因此无法执行。我的解决方案是通过将SQL查询转换为结果列表来强制生成结果。这将LINQSQL与LINQXML分开 var all = from bm in MYTABLE select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML}; var docs = fro

XML:

解决方案

有两个问题

-我猜只有在实际需要结果时才会执行查询。当我从SQL发展到XML查询时,结果查询变成了SQL和XML的混合,因此无法执行。我的解决方案是通过将SQL查询转换为结果列表来强制生成结果。这将LINQSQL与LINQXML分开

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");
-第二个问题是,我忘记将名称空间添加到XML查询中。一旦我这样做了,我就得到了要求的结果

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

谢谢你的帮助

下面是一个代码片段,它使用了您的代码和MYTABLE的硬编码内容,并且可以通过LinqPad进行完美验证。也许您的数据库表或MYTABLE不包含您认为它所包含的内容?你能检查一下所有测试的结果吗

输出:

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

希望这有帮助

以下是我尝试过的几件事

设置:我创建了一个数据库,其中有一个表MYTABLE,包含2列。第1列SPP\U USER\U ID为varchar255,第2列SPP\U书签\U XML为XML数据类型。我添加了两行,与mellamokb使用的行一致。我创建了一个LINQ到SQL的设计图面,并将其拖到这个表中。我的应用程序只是一个控制台应用程序,它加载LINQ到SQL数据上下文,然后调用您的命令。 我直接查询数据表,如下所示:

<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
        var all = from bm in context.MYTABLEs
                  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");
结果是一组IEnumerables。也就是说,对于数据库中的每一行,我都会得到一个包含所有href子体的IEnumerable。在这个场景中,我得到了两个结果;第一个结果是包含2个元素的IEnumerable,第二个结果是包含1个元素的IEnumerable。从你的描述来看,这似乎至少接近你想要的。然而,由于查询的结构方式,您可能看不到预期的结果

请注意,有时很难让VisualStudio实际显示这样的查询结果。我发现,我经常必须先查看该项两次,然后才能启动结果枚举

我试图复制您的OP中编写的代码,如下所示:

<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
        var all = from bm in context.MYTABLEs
                  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");
当我这样做时,它导致xml值被丢弃,因为它已经是一个XDocument,所以将其转换为字符串会导致所有标记被剥离。因此,接下来的两条语句因XML解析异常而失败


你不给我想要的是什么意思?错误的结果?没有结果?慢?@银河牛仔-编辑。希望现在能更清楚地回答另一个问题-您如何从LINQ转换到SQL,并将其称为MYTABLE?或者这是实际context.MYTABLE的伪代码?数据库中SPP\u BOOKMARKS\u XML的数据类型是什么?它是XML数据类型还是varchar?@mellamokb-它是varchar类型有趣的结果。如果将SPP\u BOOKMARKS\u XML更改为varchar数据类型,会发生什么情况?如果我做了更改,则第3项的行为与第2项完全相同。谢谢,但这里的区别是,它完全是linq to XML—这里不涉及SQL。我从'from h in docs'操作中收到一条错误消息,类似于'XDocument.Parse-在SQL中不受支持'。我可以这样混合SQL和XML查询吗?
        var MYTABLE = (from bm in context.MYTABLEs select bm).ToList();

        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");